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