实用绘图算法1---已知圆上两点坐标、半径及前进方向确定圆心所在位置(路线圆曲线绘制方法)

本文介绍了在CAD二次开发中,如何根据起点、终点坐标、半径和前进方向四个条件绘制圆曲线。首先,通过数学方法推导出圆心坐标,然后利用点在射线左侧或右侧的判断原理确定正确圆心。通过C#代码实现方向判断,并结合前进方向确定唯一圆心,从而完成圆曲线的绘制。
摘要由CSDN通过智能技术生成

在开发路线类应用绘制圆曲线的时候,遇到了一个问题就是:已知圆曲线起点和终点的坐标、曲率半径及前进方向四个条件绘制圆曲线。而封装好的绘制圆曲线的函数是根据极坐标方法绘制的,因此需要提供四个参数。

【1】圆心坐标

【2】起始角度

【3】终止角度

【4】半径

那么在不自己重新定义函数的情况下,很显然你要确定圆心坐标,有了这个坐标,那么起始角度和终止角度通过坐标反算也就不难求得了。请大佬们继续阅读。


目录

1.圆心确定

2.方向判断原理(点在射线的左侧右侧)

3.方向判断举例

4.总结

5.参考文献


 1.圆心确定

我汇总了下网上确定圆心的方法,发现这一种初中方法可以说是简单高效:

已知两点坐标(x1, y1), (x2, y2)和半径R,求圆心坐标(x0, y0)。手算推导如下【拿的别人的图,我自己也手推了,但是太乱了,思路很简单,推导麻烦点】。

代码实现【C#】

方法getDirectionByPoint()后面代码会介绍【规定direction=1为前进方向右偏,-1为前进方向左偏】:

 /// <summary>
        /// 根据圆上两点和半径和前进方向确定圆心
 
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用中点算法和Bresenham算法在OpenGL上绘制的代码: ```c++ #include <GL/glut.h> #include <cmath> #include <iostream> using namespace std; // 中点算法 void midPointCircle(int x0, int y0, int r) { int x = r, y = 0; int p = 1 - r; glBegin(GL_POINTS); while (x >= y) { glVertex2i(x0 + x, y0 + y); glVertex2i(x0 + y, y0 + x); glVertex2i(x0 - y, y0 + x); glVertex2i(x0 - x, y0 + y); glVertex2i(x0 - x, y0 - y); glVertex2i(x0 - y, y0 - x); glVertex2i(x0 + y, y0 - x); glVertex2i(x0 + x, y0 - y); y++; if (p <= 0) p += 2 * y + 1; else { x--; p += 2 * (y - x) + 1; } } glEnd(); } // Bresenham算法 void bresenhamCircle(int x0, int y0, int r) { int x = 0, y = r; int d = 3 - 2 * r; glBegin(GL_POINTS); while (x <= y) { glVertex2i(x0 + x, y0 + y); glVertex2i(x0 + y, y0 + x); glVertex2i(x0 - y, y0 + x); glVertex2i(x0 - x, y0 + y); glVertex2i(x0 - x, y0 - y); glVertex2i(x0 - y, y0 - x); glVertex2i(x0 + y, y0 - x); glVertex2i(x0 + x, y0 - y); if (d < 0) d = d + 4 * x + 6; else { d = d + 4 * (x - y) + 10; y--; } x++; } glEnd(); } void display() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 1.0f, 1.0f); // 输入两个圆心坐标半径长 int x1, y1, r1, x2, y2, r2; cout << "请输入第一个圆心坐标半径:"; cin >> x1 >> y1 >> r1; cout << "请输入第二个圆心坐标半径:"; cin >> x2 >> y2 >> r2; // 绘制第一个 glColor3f(1.0f, 0.0f, 0.0f); midPointCircle(x1, y1, r1); glColor3f(0.0f, 1.0f, 0.0f); bresenhamCircle(x1, y1, r1); // 绘制第二个 glColor3f(0.0f, 0.0f, 1.0f); midPointCircle(x2, y2, r2); glColor3f(1.0f, 1.0f, 0.0f); bresenhamCircle(x2, y2, r2); glFlush(); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(500, 500); glutCreateWindow("Circle Drawing Algorithms"); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 500.0, 0.0, 500.0); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 在程序中,我们通过`midPointCircle`和`bresenhamCircle`函数分别使用中点算法和Bresenham算法绘制。在`display`函数中,我们输入两个圆心坐标半径长,并依次使用两种算法绘制出这两个。最终,我们使用OpenGL的基本绘图函数`glBegin`和`glVertex2i`将绘制在屏幕上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韦_恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值