ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:148.02KB ,
资源ID:7960399      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7960399.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(悬挂系统经典算法.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

悬挂系统经典算法.docx

1、悬挂系统经典算法OpenGL只提供了几种画简单直线图元的函数,这是为了便于硬件的支持,和硬件效率的提高。但实际工作中,会用到大量的曲线和曲面,通常画曲线和曲面的方法,是采用细分法,用直线或平面去逼近。对于曲面的逼近,通常采用三角图元去逼近(因为三角形可以保证三个顶点在一个平面上),如果要渲染光照效果,在细分过程中,一定要计算每个点的法向量。对于曲面的逼近,例如,用球的内接正四面体的细分去逼近球,那么,在细分的过程中,首先求的每个边的中点,然后根据该点法向量,求出该点在球面上对应的点的坐标,然后再做细分操作。对于球体,对内接体上的点做单位化处理,就能得到其再球面上应该对应的位置。 本文以平面图形

2、的逼近为例,举两个例子,圆的逼近和抛物线的逼近。 一、圆的逼近 首先,画出圆的内接正三角形。 GLfloat p12=0,1,p22=-sqrt(3.0)/2,-1/2.0,p32=sqrt(3.0)/2,-1/2.0; glBegin(GL_LINE_LOOP); glVertex2fv(p1); glVertex2fv(p2); glVertex2fv(p3); glEnd(); 然后,用递归函数,每一步,首先求的三角形边p1p2上的中点p,再对该中点坐标做单位化处理,得到其在圆上的坐标,然后分别连接p1p和pp2,获得一次细分。一次类推,当满足递归层次的时候,画出结果。void para

3、(GLfloat *p1,GLfloat *p2,int depth)GLfloat p2=0,0;for (int i=0;i2;i+)pi=(p1i+p2i)/2;/近似形上两点的中点GLfloat d=sqrt(p0*p0+p1*p1);p0/=d;p1/=d;/根据法向量计算中点在圆上的位置if (depthmaxdepth)para(p1,p,depth+1);para(p,p2,depth+1);elseglBegin(GL_LINES);glVertex2fv(p1);glVertex2fv(p);glVertex2fv(p);glVertex2fv(p2);glEnd();gl

4、Flush();在display()函数中调用递归函数para(p1,p2,0);para(p2,p3,0);para(p3,p1,0);对三条边分别进行细分。递归1次,2次,3次得到的结果如下:单片机控制下步进电机画圆方法2007-05-16 20:21:59|分类: 单片机学习 |标签: |字号大中小订阅 一 直线算法1. 直线插补法 :直线插补法是在绘图系统中常用的一种逐点比较算法。它的原理是:执行机构每走一步,都要和给定轨迹上的坐标值进行一次比较,看当前位置和轨迹位置的关系,从而确定下一步的进给方向。如果当前位置在给定轨迹的下方,下一步向给定轨迹的上方走,反之则相反。如果当前位置在给定

5、轨迹的里面,下一步向给定轨迹的外面走,反之则相反。这样走一步看一步,决定下一步走向,形成“逐点比较”,使走线逼近给定轨迹。2.多边形逼近画圆一个正多边形,当其边数 n 足够大,即每边所对的圆心角 足够小时,就非常接近一个圆。这样,画圆的问题就变成画多边形、画直线的问题了,只要确定 n 和 角的大小,多边形顶点的坐标位置,我们就可以绕开烦琐的象限问题,直接利用上面的画线的简易算法来实现画圆。3.圆弧插补法圆弧插补法也是在绘图系统中常用的一种方法,它和直线插补法原理相同,也是逐点比较算法。若 F=0,表明加工点在圆弧上;F0,表明加工点在圆弧外;F0,表明加工点在圆弧内。若 F0,为逼近圆弧,下一

6、步向-X轴进给一步,并计算出新的偏差值;F0,为逼近圆弧,下一步向+Y 轴进给一步,并计算出新的偏差值。各象限插补公式如下步进电机控制下画笔具体走法最后附上3相步进电机与AT89C51单片机驱动电路:#include#includesbit cp1 = P10;sbit cw1 = P11;sbit cp2 = P12;sbit cw2 = P13;float step(float x1,float y1,float x2,float y2) float buj;float chd1;chd1 = sqrt(x1) * (x1) + y1 * y1) - sqrt(x2) * (x2) + y

7、2 * y2);buj = chd1 / 0.01; return buj;void delay(int i)while(i -);void buj(float buj1,float buj2) int i,j,y,b; if(buj1 0)cw1 = 1;buj1 = -buj1;elsecw1 = 0;if(buj2 buj2) b = buj1/buj2; y = buj1 - b * buj2; for(i = 1; i = buj2; i +) for(j = 1; j = b; j +) cp1 = 0; delay(100); cp1 = 1; delay(100); cp2 =

8、 0; delay(100); cp2 = 1; delay(100); if(y != 0) cp1 = 0; delay(100); cp1 = 1; delay(100); y -; else b = buj2 / buj1; y = buj2 - buj1 * b; for(i = 1; i = buj1; i +) for(j = 1; j = b; j +) cp2 = 0; delay(100); cp2 = 1; delay(100); cp1 = 0; delay(100); cp1 = 1; delay(100); if(y != 0) cp2 = 0; delay(100

9、); cp2 = 1; delay(100); y -; void delay10ms()unsignedint i,j;for(j = 10; j != 0; j -)for(i = 125; i != 0; i-);void san() /玫瑰线r = 20 * sin(3 * (-1.5707963);x = 40 + r * cos(-1.5707963);y = 50 + r * sin(-1.5707963);for(i = -1.5707963; i = 1.5707963; i = i + 3.1415926 / 180)r = 20 * sin(3 * (i); w = 40

10、 + r * cos(i);v = 50 + r * sin(i);buj1 = step(x + 15,115 - y,w + 15,115 - v);buj2 = step(95 - x,115 - y,95 - w,115 - v);buj(buj1,buj2);x = w;y = v;void yuan()/画圆r = 20;x = 40;y = 30;for(i = -1.5707963; i = 4.85; i = i + 3.1415926 / 180) w = 40 + r * cos(i); v = 50 + r * sin(i);buj1 = step(x + 15,115

11、 - y,w + 15,115 - v);buj2 = step(95 - x,115 - y,95 - w,115 - v);buj(buj1,buj2);x = w;y = v;void star()/星形线float a1,b1;r = 20;a1 = 60;b1 = 30;x = a1 + r * cos(1.7); y = b1 + r * sin(1.7);for(i = 1.7; i = 3.1415926; i = i + 3.1415926 / 180)w = a1 + r * cos(i); v = b1 + r * sin(i);buj1 = step(x + 15,11

12、5 - y,w + 15,115 - v);buj2 = step(95 - x,115 - y,95 - w,115 - v);buj(buj1,buj2);x = w;y = v;a1 = 20;b1 = 30;for(i = 0; i = 1.5707963; i = i + 3.1415926 / 180)w = a1 + r * cos(i); v = b1 + r * sin(i);buj1 = step(x + 15,115 - y,w + 15,115 - v);buj2 = step(95 - x,115 - y,95 - w,115 - v);buj(buj1,buj2);

13、x = w;y = v;a1 = 20;b1 = 70;for(i = -1.5707963; i = 0; i = i + 3.1415926 / 180)w = a1 + r * cos(i); v = b1 + r * sin(i);buj1 = step(x + 15,115 - y,w + 15,115 - v);buj2 = step(95 - x,115 - y,95 - w,115 - v);buj(buj1,buj2);x = w;y = v;a1 = 60;b1 = 70;for(i = 3.1415926; i = 4.65; i = i + 3.1415926 / 18

14、0)w = a1 + r * cos(i); v = b1 + r * sin(i);buj1 = step(x + 15,115 - y,w + 15,115 - v);buj2 = step(95 - x,115 - y,95 - w,115 - v);buj(buj1,buj2);x = w;y = v;void mysin() /y = zhengfu * sin(pinlv * (x - xiangwei) + pianzhi /正弦线x = 20;y = 30;v = 20 + 1 / 0.13 * 6.6;r = 1 / 0.13 * 6.2831852 /360;for(i =

15、 20; i = v; i = i + r)w = 15 * sin(0.13 * (i - 20) + 30;buj1 = step(x + 15,115 - y,i + 15,115 - w);buj2 = step(95 - x,115 - y,95 - i,115 - w);buj(buj1,buj2);x = i;y = w;void list() /直线 buj1 = step(54 + 15,115 - 50,40 + 15,115 - 30);buj2 = step(95 - 54,115 - 50,95 - 40,115 - 30);buj(buj1,buj2);void m

16、ain() bit flag; while(1) do while(key); delay10ms(); if(key = 0) flag = 0; mysin(); else flag = 1; while(flag); do while(key); delay10ms(); if(key = 0) flag = 0; star(); else flag = 1; while(flag); do while(key); delay10ms(); if(key = 0) flag = 0; list(); else flag = 1; while(flag); do while(key); delay10ms(); if(key = 0) flag = 0; yuan(); else flag = 1; while(flag); do while(key); delay10ms(); if(key = 0) flag = 0; san(); else flag = 1; while(flag);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1