标题:求基本图形的算法
只看楼主
yuye851029
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-9-18
 问题点数:0 回复次数:5 
求基本图形的算法
求直线、圆、椭圆、多边形地各种算法,请高手帮帮忙
搜索更多相关主题的帖子: 算法 图形 多边形 椭圆 直线 
2008-05-03 08:17
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
得分:0 
不就是几何公式么,你还想有什么算法?

女侠,约吗?
2008-05-03 10:09
许苏娟
Rank: 1
等 级:新手上路
威 望:1
帖 子:40
专家分:9
注 册:2010-4-3
得分:0 
#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>
void init(void)
    {//初始化函数,也可以不要
    glClearColor (1.0, 1.0, 1.0, 0.0); // 指定清空颜色(背景色)为白色   
    glMatrixMode (GL_PROJECTION); //指定投影矩阵
    gluOrtho2D (0.0, 400.0, 0.0, 400.0); //指定坐标系上显示的区域
    }

void setPixel(GLint x, GLint y){
    glBegin(GL_POINTS);
    glVertex2i(x, y);
    glEnd();
    Sleep(10);
    glFlush();
}
inline int round (const float a) { return int (a + 0.5); }
void LineDDA (int x0, int y0, int xEnd, int yEnd){
        int dx = xEnd - x0, dy = yEnd - y0, steps, k;
        float xIncrement, yIncrement, x = x0, y = y0;
        if (fabs (dx) > fabs (dy))
            steps = fabs (dx);
        else
            steps = fabs (dy);
        xIncrement = float (dx) / float (steps);
        yIncrement = float (dy) / float (steps);
        setPixel (round (x), round (y));
        for (k = 0; k < steps; k++) {
            x += xIncrement;
            y += yIncrement;
            setPixel (round (x), round (y));
        }
    }

   
    void myDisplay(void)
    {// 图形绘制回调函数,通常把图形绘制代码写到这个函数里面
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3f (0.0, 0.0, 1.0); // 指定前景色(当前绘制颜色)为蓝色
        LineDDA(10,10,500,200) ;
        glEnd ( );
        glFlush();
    }
    void main(int argc, char *argv[])
    {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
        glutInitWindowPosition(100, 100);
        glutInitWindowSize(400, 400);
        glutCreateWindow("DDA 直线生成算法");
        init();
        glutDisplayFunc(myDisplay);
        glutMainLoop();
    }
2010-06-23 19:15
许苏娟
Rank: 1
等 级:新手上路
威 望:1
帖 子:40
专家分:9
注 册:2010-4-3
得分:0 
DDA直线算法
2010-06-23 19:15
许苏娟
Rank: 1
等 级:新手上路
威 望:1
帖 子:40
专家分:9
注 册:2010-4-3
得分:0 
椭圆算法
#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>
void init(void)
    {//初始化函数,也可以不要
    glClearColor (1.0, 1.0, 1.0, 0.0); // 指定清空颜色(背景色)为白色   
    glMatrixMode (GL_PROJECTION); //指定投影矩阵
    gluOrtho2D (0.0, 600.0, 0.0, 600.0); //指定坐标系上显示的区域
    }
class scrPt {
public:
GLint x, y;
};
void setPixel (GLint x, GLint y)
{
glBegin (GL_POINTS);
glVertex2i (x, y);
glEnd ( );
Sleep(10);
glFlush();
}
inline int round (const float a) { return int (a + 0.5); }
/* The following procedure accepts values for an ellipse
* center position and its semimajor and semiminor axes, then
* calculates ellipse positions using the midpoint algorithm.
*/
void ellipseMidpoint (int xCenter, int yCenter, int Rx, int Ry)
{
int Rx2 = Rx * Rx;
int Ry2 = Ry * Ry;
int twoRx2 = 2 * Rx2;
int twoRy2 = 2 * Ry2;
int p;
int x = 0;
int y = Ry;
int px = 0;
int py = twoRx2 * y;
void ellipsePlotPoints (int, int, int, int);
/* Plot the initial point in each quadrant. */
ellipsePlotPoints (xCenter, yCenter, x, y);
/* Region 1 */
p = round (Ry2 - (Rx2 * Ry) + (0.25 * Rx2));
while (px < py) {
x++;
px += twoRy2;
if (p < 0)
p += Ry2 + px;
else {
y--;
py -= twoRx2;
p += Ry2 + px - py;
}
ellipsePlotPoints (xCenter, yCenter, x, y);
}
/* Region 2 */
p = round (Ry2 * (x+0.5) * (x+0.5) + Rx2 * (y-1) * (y-1) - Rx2 * Ry2);
while (y > 0) {
y--;
py -= twoRx2;
if (p > 0)
p += Rx2 - py;
else {
x++;
px += twoRy2;
p += Rx2 - py + px;
}
ellipsePlotPoints (xCenter, yCenter, x, y);
}
}
void ellipsePlotPoints (int xCenter, int yCenter, int x, int y)
{
setPixel (xCenter + x, yCenter + y);
setPixel (xCenter - x, yCenter + y);
setPixel (xCenter + x, yCenter - y);
setPixel (xCenter - x, yCenter - y);
}
   
void myDisplay(void)
{// 图形绘制回调函数,通常把图形绘制代码写到这个函数里面
glClear(GL_COLOR_BUFFER_BIT);
glColor3f (0.0, 0.0, 1.0); // 指定前景色(当前绘制颜色)为蓝色
ellipseMidpoint (300, 300, 200, 100);
glEnd ( );
glFlush ( ); // 使绘制立即反映到屏幕上
}
    void main(int argc, char *argv[])
    {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
        glutInitWindowPosition(0, 0);
        glutInitWindowSize(600, 600);
        glutCreateWindow("ellipseMidpoint");
        init();
        glutDisplayFunc(myDisplay);
        glutMainLoop();
    }
2010-06-23 19:19
许苏娟
Rank: 1
等 级:新手上路
威 望:1
帖 子:40
专家分:9
注 册:2010-4-3
得分:0 
给分我哦~
2010-06-23 19:20



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-212105-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021818 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved