找回密码
 注册
Simdroid-非首页
查看: 128|回复: 10

已知圆周上各点坐标,如何将圆转换为360度直线

[复制链接]
发表于 2013-5-24 17:56:17 | 显示全部楼层 |阅读模式 来自 广东深圳
我有一240*4的矩阵,前两列正好是分布在一个半径为0.005圆周上的坐标点(如图1中的红*),我的目的是将前两列经反三角或其他方式转换为对应的360度直线,然后以这条直线为x轴,分别得到矩阵的第三、四列的二维图,想得到如图2的结果,但我经反三角函数变化后(试过很多方法),得到的图很乱。请高手帮下忙,先谢谢了
   
  图1,前两列对应的图                                                   2 x轴是由前两列转换而得的

下面是我的部分数据(整个数据在附件里)

  2.1195130e-018 -5.0000004e-003 -5.8866244e+003  8.3838407e+003
-1.2927217e-004 -4.9983291e-003 -6.4644268e+003  8.4098488e+003
     1.2927217e-004 -4.9983291e-003 -5.3442376e+003  8.2814140e+003
-2.5952412e-004 -4.9932608e-003 -7.0453113e+003  8.4341468e+003
     2.5952412e-004 -4.9932608e-003 -4.9248484e+003  8.0371400e+003
-3.9040763e-004 -4.9847346e-003 -7.6547117e+003  8.4517707e+003
     3.9040763e-004 -4.9847346e-003 -4.5412538e+003  7.8258028e+003
   -5.2156451e-004 -4.9727228e-003 -8.2930520e+003  8.4763877e+003
     5.2156451e-004 -4.9727228e-003 -4.1754575e+003  7.7050938e+003
-6.5263093e-004 -4.9572247e-003 -8.8750256e+003  8.4573361e+003
     6.5263093e-004 -4.9572247e-003 -3.9336525e+003  7.7314030e+003
-7.8324275e-004 -4.9382723e-003 -9.3956711e+003  8.4560658e+003
     7.8324275e-004 -4.9382723e-003 -3.7928207e+003  7.9660194e+003
    -9.1303955e-004 -4.9159294e-003 -9.9061493e+003  8.4296295e+003
     9.1303955e-004 -4.9159294e-003 -3.5791294e+003  8.0809199e+003
-1.0416699e-003 -4.8902892e-003 -1.0382426e+004  8.3558926e+003
     1.0416699e-003 -4.8902892e-003 -3.2145386e+003  7.9438170e+003
-1.1687954e-003 -4.8614722e-003 -1.0782399e+004  8.2597157e+003
     1.1687954e-003 -4.8614722e-003 -2.9140631e+003  7.8138520e+003
-1.2940953e-003 -4.8296293e-003 -1.1087138e+004  8.1446527e+003
     1.2940953e-003 -4.8296293e-003 -2.7736140e+003  7.6369052e+003



我的程序:
clear;clc;
load z02ms.dat %数据名
x=z02ms(:,1);y=z02ms(:,2);r=abs(sqrt(x.^2+y.^2));
[m,n]=size(z02ms);
ang=[m,1];%ang是前两列转化对应角,也曾直接用“[ang,RHO] = cart2pol(z02ms(:,1),z02ms(:,2));”等转过
for i=1:m
       if x(i,1)>0 && y(i,1)>0
           ang(i,1)=asind(y(i,1)/r(i,1));
       elseif  x(i,1)<0 && y(i,1)>0
           ang(i,1)=90-acosd(y(i,1)/r(i,1));
       elseif  x(i,1)<0 && y(i,1)<0
           ang(i,1)=180-asind(y(i,1)/r(i,1));
       else  
           ang(i,1)=270-acosd(y(i,1)/r(i,1));
       end
end
me=z02ms(:,3);st=z02ms(:,4);
subplot 211, plot(ang,me);
xlabel('\it\theta\^o');ylabel('mean pressure');
title('mean pressure ');
grid on

subplot 212, plot(ang,st);
xlabel('\it\theta\^o');ylabel('Fluctuating pressure');
title('Fluctuating pressure rms');
grid on

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2013-5-24 20:23:24 | 显示全部楼层 来自 新疆乌鲁木齐
Simdroid开发平台
本帖最后由 bainhome 于 2013-5-24 20:25 编辑

用sortrows对点排序即可。纵坐标跟你那个图形不一样,但整体形状差不多。 另外,不是0到360度,这个自己可以做平移。
  1. [the,r]=cart2pol(data(:,1),data(:,2));
  2. theta=the*180/pi;
  3. dx=[theta,data(:,3)];
  4. dx=sortrows(dx);
  5. plot(dx(:,1),dx(:,2))
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2013-5-25 04:00:36 | 显示全部楼层 来自 英国
你的原始数据第一二行(x,y)数据对应的点不是沿着圆周逆时针前进的,是跳跃和无序的。
所以你就很凌乱,呵呵。
在你的代码基础上对ang排一下顺序即可,当然是要在你角度转换部分无误的基础上。
Good luck.

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2013-5-25 15:50:29 | 显示全部楼层 来自 广东深圳
bainhome 发表于 2013-5-24 20:23
用sortrows对点排序即可。纵坐标跟你那个图形不一样,但整体形状差不多。 另外,不是0到360度,这个自己可 ...

谢谢了,帮我解决大问题了,这个问题我都纠结了半个月了。
回复 不支持

使用道具 举报

 楼主| 发表于 2013-5-25 15:52:51 | 显示全部楼层 来自 广东深圳
lin2009 发表于 2013-5-25 04:00
你的原始数据第一二行(x,y)数据对应的点不是沿着圆周逆时针前进的,是跳跃和无序的。
所以你就很凌乱,呵 ...

谢谢指点,二楼的bainhome 已帮我解决问题了。非常感谢二位

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2013-5-25 22:05:10 | 显示全部楼层 来自 台湾
真的解决问题?
个人是执负面的观点! 还真有些心灰意冷的感觉

点评

好久没见着老哥过来串门了,先给你来个红包~~我们这儿气氛不错的,不用心灰意冷吧?!  发表于 2013-5-25 22:32
感觉应该解决了吧?就是sortrows的问题,老哥试试就知道了  发表于 2013-5-25 22:27

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2013-5-25 22:51:35 | 显示全部楼层 来自 台湾
感觉应该解决了吧?就是sortrows的问题,老哥试试就知道了
昨晚就试过了! 可能又没说清楚了
不是指诸位高手没帮LZ解决问题! 而是指LZ其实还留著许多问题
反正假日坐等LZ回应!

好久没见着老哥过来串门了,先给你来个红包~~我们这儿气氛不错的,不用心灰意冷吧?!
害我吓一跳! 不是没贴其他意见! 没扣分还送红包
另请体谅下在此通知LZ
若有时间还是会来此跟诸位学习的

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2013-5-27 08:16:11 | 显示全部楼层 来自 台湾
本帖最后由 ChaChing 于 2013-5-27 08:50 编辑

可能原来没说清楚造成马兄弟误会, 真有些过意不去! 本想若LZ没回应(个人预期会如此), 就省事懒得说了, 反正干卿何事!
现在好像不说清楚还真不行了! 的确真的有些"力不从心"了, 眼睛花的厉害, 打字真有些吃力!(都150%!) 真是自作自受! 应该乖乖当我的看倌好好的学习便是, 何况没什麼硬实力, 该要学的还真多

为何说还存在问题? 或许仅是个人看法而已, 或许过於吹毛求疵!
再次重申不是指高手们没帮LZ解决问题!

长期来我好像看到一个现象, 许多人只要有程序可通了, 就不管原来自编的程序错在哪裡的!? 别忘记那是高手给的程序, 当然精湛可执行!
但个人以为, 清楚了解自编的程序错在那裡才是最基本的! 毕竟下次编程还是得自己来, 除非根本无此準备或心态! 若不关心自编的程序错在那裡, 那些错误不就一直存在吗? 敢问下如此真的会踏实吗? 对自己编程功力会真的有进步吗?
当然若能直接学习到高人的方式, 也不是不可, 只不过并非每个人都可以达到如此境界
所以个人一直以为若能知道原来错在哪裡, 才是真正解决问题! 当然我指的问题不仅是一般表面上的!

总之我要强调的重点, 不在有无实力或程度去学会那精湛的程序(这因人而异,改变有限), 而是在於有无那排误的学习态度! 个人感官迟钝, 还真没能察觉有存在这些态度!?
个人不才,不知有无交代清楚!? (做错事录口供~^~)


以下便是本来要po的东东, 本想算了(没营养又顾人怨!), 但还是…,恳请LZ与看倌包涵了

针对LZ的程序, 其中隐藏了不少问题! 就说说个人自以为是真正解决问题的过程或方式吧

1.建议养成好习惯,多看下Workspace及Help中的资讯
a)若看下Workspace, 就会发现ang是240*2,me是240*1!
b)如此plot(ang,me)其实是画了两条线! 等同plot(ang(:,1),me); hold on; plot(ang(:,2),me); 只不过第二条线几乎与y轴重合了! 可以修改那两个绘图指令成plot(ang,me,'o'); plot(ang,st,'o');便会很容易发现
c)追究ang为何是240*2, 不难发现是ang=[m,1]的错用! 我想LZ是要Preallocation,那就应该是ang=zeros([m,1]);吧!

2.建议多点开变数内容(使用双击)看看!
a)若看过x变数, 不难发现要画的x轴并非单调增加! (或者使用issorted检查)
b)如此是LZ要的吗? 若不是, 是否需考虑下先排序下或不画线!? 排序请help下sort或sortrows, 不画线类似上头检查图形的用法

3.建议养成好习惯,使用函数前先查下help并小试一下
a)若看过asin/acos的help, 不难发现asin/acos的输出范围分别是-pi/2~pi/2及0~pi, 那就需小心使用於各个象限
b)从先排序或不画线下的图形, 不难发现原写法產生非单值对应, 若LZ确认输入为一对一, 那就一定是用错了函数(可别如同某些人竟怀疑matlab函数)
c)要用对函数, 数学底子强的人或许直接即可应用正确, 但若如同个人水平一般的, 也可使用asind(1/2), acosd(1/2),asind(-1/2),acosd(-1/2)检验下, 不是吗
d)原来的逻辑判断未考虑出现零的情况, 很幸运LZ的原始座标点并无此状况
e)建议儘可能採用同一函数判断, 一下asin一下acos, 不是把问题复杂化, 个人以为一般人愈简化愈不会出错
f)另因为asin或acos的范围未含盖全域, 使得必须考虑较多, 若能多花些时间搜下help, 应该可以发现atan2或许更适用, 当然cart2pol及angle应该也可以

4.明明是一维的变数, 干嘛要使用二维的表示方式! 这样程序看起来很复杂, 一复杂化应该就容易出错吧!
5.xlabel('\it\theta^\o')

这些都是不难的错误(因为连老头都查到了), 相信LZ仔细点也可以自我发现! 只不过LZ好像浪费了一次自我排误的经验! 窃以为自我排误经验愈多, 编程能力自然提昇!
  1. clear; clc;
  2. load z02ms.dat; x=z02ms(:,1); y=z02ms(:,2); me=z02ms(:,3); st=z02ms(:,4);
  3. [m,n]=size(z02ms); r=abs(sqrt(x.^2+y.^2)); ang=zeros(m,1);
  4. for i=1:m, temp=asind(y(i)/r(i)); acs=acosd(y(i)/r(i));
  5.       if x(i)>=0 && y(i)>=0, ang(i)=temp;
  6.       elseif x(i)<0 && y(i)>=0, ang(i)=90+acs; % ang(i)=180-temp;
  7.       elseif x(i)<=0 && y(i)<0, ang(i)=180-temp;
  8.       else ang(i)=450-acs; % ang(i)=360+temp;
  9.       end
  10. end
  11. %% ang=atan2(y,x)*180/pi; ii=ang<0; ang(ii)=ang(ii)+360; %3~10行可更改成这一行
  12. [ang,indx]=sortrows(ang); me=me(indx); st=st(indx);
  13. subplot 211, plot(ang,me); grid on
  14. xlabel('\it\theta^\o');ylabel('mean pressure'); title('mean pressure ');
  15. subplot 212, plot(ang,st); grid on
  16. xlabel('\it\theta^\o');ylabel('Fluctuating pressure'); title('Fluctuating pressure rms');
复制代码

评分

2

查看全部评分

回复 不支持

使用道具 举报

发表于 2013-5-27 18:09:18 | 显示全部楼层 来自 新疆乌鲁木齐
老哥语重心长,字字珠玑,亦师亦友,能有如此劝诫,心中十分感动。
如果楼主看到,还请回来分享以及完善讨论细节,simwe同仁以及我会尽力回复,将这个问题拓展并圆满解决。
回复 不支持

使用道具 举报

 楼主| 发表于 2013-5-28 09:55:22 | 显示全部楼层 来自 广东深圳
ChaChing 发表于 2013-5-27 08:16
可能原来没说清楚造成马兄弟误会, 真有些过意不去! 本想若LZ没回应(个人预期会如此), 就省事懒得说了, 反正 ...

非常感谢ChaChing和bainhome二位的关心,我在振动论坛里已回复了。不过,这几天有其他事情,还没好好理一下上传的原程序在各象限的角度变化为什么会和用cart2pol转换得到的结果不同,所以Chaching帮修改的程序和ainhome和程序得到不同结果。等我理好了,会回复大家的,以便答谢各位关心
回复 不支持

使用道具 举报

发表于 2013-5-28 10:57:47 | 显示全部楼层 来自 台湾
guohf 发表于 2013-5-28 09:55
非常感谢ChaChing和bainhome二位的关心,我在振动论坛里已回复了。不过,这几天有其他事情,还没好好理一 ...


可能LZ还没空细看!
我与bainhome的图形结果本质是一样的! 只不过atan2及cart2pol的输出范围是-pi~pi, 我已经依LZ需求转换为(0~360)
8F有给了atan2的方式, 但我有将-pi~0转换至pi~2*pi, 若不转换就完全与bainhome的图形结果是一样了
其实另一盲点, 在打字时又忘记提醒了!
一般习惯好像flow都是由左流向右, 所以请注意下LZ的零点是否与文献相对
8F程序是以右边为零度
另bainhome所谓的平移, 应该不是LZ所谓的+180
这个观念(+180)是有问题的, 之所以图形类似是因LZ给的数据刚好对称(没空检验,不确定), 若不是就错了

点评

嗯,相位变化应以专业知识背景为准,我不大清楚横坐标的意义是驻点压力发生的时间相位还是几何坐标,因此不能做判断。  发表于 2013-5-28 11:11

评分

1

查看全部评分

回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-6-16 20:55 , Processed in 0.054154 second(s), 21 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表