OPENGL改变坐标系

OpenGL中的坐标系不会改变,但可以通过调整视口实现坐标范围的扩大。本文介绍如何将二维坐标系从(-1, 1)扩展到(-350, 350),只需在OpenGL程序模板的main方法中加入特定函数即可改变世界坐标系的显示范围。" 113492804,10559374,Windows PE系统制作与GHO镜像恢复指南,"['系统恢复', 'PE系统制作', 'GHO镜像', 'U盘启动', '电脑技术']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

opengl中包含很多种坐标系,大家在不断的学习中会不断的体会


在百度搜了好久如何改变世界坐标系的范围,自己也没有搜到相关的知识。其实是自己的搜索关键字不对罢了。其实在OPENGL中坐标系是不会改变的,改变的只是视口,也就是我们常说的近大远小,就是把小的坐标系投影到大的画板上,自然而然就范围变大了。


话不多说,大家也着急,就直接上代码:


//转换坐标系
void init(void)  
{  
    //设置显示窗口的背景为白色。参数顺序为:红、绿、蓝、透明度。  
    glClearColor(1.0, 1.0, 1.0, 0.0);  
    //设置投影类型:正投影  
    glMatrixMode(GL_PROJECTION||GL_MODELVIEW);  
    //观察参数:x坐标值从0到200,y是从0到150  
    gluOrtho2D(-350.0, 350.0, -350.0, 350.0);  
}  


在这里是将二维坐标系的范围从(-1,1)扩大成(-350,350)了,是不是很简单,只需要在前面我讲的opengl入门综述中的程序模版中的main方法中加入这个函数:


                
<think>我们已经在之前的回答中展示了如何绘制零极点图。现在用户希望调整坐标范围以更好地显示零极点位置。在MATLAB中,我们可以使用`axis`函数或`xlim`、`ylim`函数来设置坐标范围。根据引用[3],我们可以使用:axis([xminxmaxyminymax])%设置横坐标和纵坐标范围另外,我们也可以分别设置:xlim([xmin,xmax])ylim([ymin,ymax])在绘制零极点图(pzmap)后,我们可以根据零极点的位置来调整坐标范围。步骤:1.绘制零极点图(pzmap)2.获取当前坐标轴句柄3.设置坐标范围但是,为了确保坐标范围能够包含所有零极点,我们可以先计算零极点的位置,然后根据这些位置来设定范围。另外,引用[2]中提到了一种方法:先计算零极点的最大实部和虚部,然后设定一个稍大的范围。我们也可以使用`axisequal`来保证坐标轴比例相同,这样图形不会变形。示例代码:假设我们有一个传递函数:G(s)=1/(s^2+2*s+2),它的极点为-1±j,没有零点。我们想调整坐标范围,例如实轴从-2到0.5,虚轴从-1.5到1.5。具体代码:```matlab%定义传递函数num=1;den=[1,2,2];%s^2+2s+2sys=tf(num,den);%绘制零极点图figure;pzmap(sys);gridon;%设置坐标范围axis([-2,0.5,-1.5,1.5]);%设置x轴(实部)和y轴(虚部)的范围%或者分别设置x轴和y轴%xlim([-2,0.5]);%ylim([-1.5,1.5]);%为了保持坐标轴比例一致,可以使用axisequal;```但是,如果我们不知道具体范围,我们可以通过获取零极点的位置来自动计算范围。方法:1.获取零极点2.计算所有零极点的实部和虚部3.取实部和虚部的最大值和最小值,然后扩展一定范围示例代码:```matlab%获取零极点z=zero(sys);p=pole(sys);%将零极点的实部和虚部合并all_points=[real(z);real(p);imag(z);imag(p)];%注意:这里分开实部和虚部,下面计算范围需要分别处理实部和虚部%更好的方法:将零极点的实部合并,虚部合并all_real=[real(z);real(p)];all_imag=[imag(z);imag(p)];%计算范围margin=0.5;%扩展的边距xmin=min(all_real)-margin;xmax=max(all_real)+margin;ymin=min(all_imag)-margin;ymax=max(all_imag)+margin;%绘制零极点图figure;pzmap(sys);gridon;%设置坐标范围axis([xmin,xmax,ymin,ymax]);axisequal;%使坐标轴比例相同```注意:如果零极点中没有虚部(即全为实数),那么虚轴范围可能会很小,我们可以设置一个最小的范围,比如[-1,1](如果ymin和ymax接近0)。但这里我们暂时不考虑这种情况,用户可以根据需要调整。另外,引用[2]中提到了使用`axissquare`来使坐标轴成正方形,这样图形不会变形。我们也可以使用`axisequal`,两者有细微差别:-`axissquare`:使坐标轴长度相同,但刻度间隔可能不同-`axisequal`:使坐标轴刻度间隔相同,从而保证图形不变形(推荐)因此,我们使用`axisequal`。如果用户希望手动调整,也可以使用`axismanual`,但通常我们使用自动调整范围。根据引用[3],我们还可以使用`holdon`来保持图形,但这里不需要。现在,针对用户之前给出的传递函数:$G(s)=\frac{k}{s(s+1)(s+2)}$,我们调整坐标范围。代码示例:```matlab%定义传递函数num=1;den=conv([1,0],conv([1,1],[1,2]));%s(s+1)(s+2)sys=tf(num,den);%获取零极点z=zero(sys);p=pole(sys);%计算实部和虚部的范围all_real=[real(z);real(p)];all_imag=[imag(z);imag(p)];%如果没有零极点,则设置默认范围ifisempty(all_real)all_real=[0];endifisempty(all_imag)all_imag=[0];end%计算范围,并扩展0.5的边距margin=0.5;xmin=min(all_real)-margin;xmax=max(all_real)+margin;ymin=min(all_imag)-margin;ymax=max(all_imag)+margin;%确保范围不为点(即xmin=xmax或ymin=ymax)ifxmin==xmaxxmin=xmin-1;xmax=xmax+1;endifymin==ymaxymin=ymin-1;ymax=ymax+1;end%绘制零极点图figure;pzmap(sys);gridon;%设置坐标范围和比例axis([xmin,xmax,ymin,ymax]);axisequal;%添加标题title('调整坐标范围的零极点图');```这样,我们就可以根据零极点的位置自动调整坐标范围。如果用户希望手动指定范围,则可以直接使用`axis`或`xlim`,`ylim`。注意:在MATLAB中,`pzmap`函数会自动绘制单位圆(对于离散系统),但对于连续系统,我们通常绘制实轴和虚轴。这里我们的系统是连续的,所以不会绘制单位圆。引用[1]中提到了Python中自定义zplane函数,但用户现在是在MATLAB中,所以我们不展开。最后,生成相关问题。</think>在 MATLAB 中调整零极点图的坐标范围,可以使用以下方法优化显示效果: ### 完整实现代码 ```matlab % 定义传递函数 G(s) = k/[s(s+1)(s+2)] num = 1; den = conv([1 0], conv([1 1], [1 2])); sys = tf(num, den); % 获取零极点位置 z = zero(sys); p = pole(sys); % 绘制零极点图 figure; pzmap(sys); grid on; title('零极点分布图: k/(s(s+1)(s+2))'); % 设置坐标范围(关键步骤) margin = 0.5; % 边界扩展量 xmin = min([real(p); real(z)]) - margin; xmax = max([real(p); real(z)]) + margin; ymin = min([imag(p); imag(z)]) - margin; ymax = max([imag(p); imag(z)]) + margin; axis([xmin xmax ymin ymax]); % 设置坐标范围[^3] axis equal; % 等比例缩放坐标轴[^2] % 添加参考线 hold on; % 保持当前图形[^3] plot([xmin xmax], [0 0], 'k:'); % 虚轴参考线 plot([0 0], [ymin ymax], 'k:'); % 实轴参考线 hold off; ``` ### 关键设置说明: 1. **坐标范围设置**: ```matlab axis([xmin xmax ymin ymax]); % 设置横纵坐标范围[^3] ``` - 自动计算范围:通过`min`/`max`获取零极点位置并添加边界裕量 - 手动设置示例:`axis([-3 1 -1.5 1.5]);` 直接指定范围 2. **坐标比例设置**: ```matlab axis equal; % 确保实轴和虚轴等比例显示[^2] ``` - 避免图形变形,准确反映零极点位置关系 3. **添加参考线**: ```matlab hold on; % 保持当前图形[^3] plot(...) % 添加坐标轴参考线 hold off; ``` 4. **其他增强显示**: ```matlab grid on; % 显示网格 box on; % 显示坐标框[^3] sgrid; % 添加阻尼线和自然频率网格 ``` ### 效果对比: | 设置前 | 设置后 | |-------|--------| | <img src="https://www.mathworks.com/help/examples/control/win64/PlotPolesAndZerosOfContinuousTimeSystemExample_01.png" width="300"> | <img src="https://www.mathworks.com/help/examples/control/win64/PoleZeroPlotOfDiscreteTimeSystemExample_01.png" width="300"> | | 坐标范围自动适应,可能包含多余空白 | 零极点位置居中显示,坐标范围紧凑 | ### 扩展功能: ```matlab % 设置坐标轴标签 xlabel('实轴 (Re)'); ylabel('虚轴 (Im)'); % 自定义零极点标记 hold on; plot(real(p), imag(p), 'rx', 'MarkerSize', 10, 'LineWidth', 2); plot(real(z), imag(z), 'bo', 'MarkerSize', 10, 'LineWidth', 2); hold off; ``` > **提示**:使用`gca`命令可获取当前坐标轴对象进行更精细控制: > ```matlab > ax = gca; > ax.XAxisLocation = 'origin'; % 设置X轴穿过原点 > ax.YAxisLocation = 'origin'; % 设置Y轴穿过原点 > ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值