c++如何遍历一个圆弧上的所有点
如题,在c++中,知道圆心坐标.半径.起点坐标和终点坐标,如何遍历从起点坐标开始逆时针方向到终点坐标的所有点啊?
不要涉及弧度
坐等高人给思路
[解决办法]
这是一个错误的想法,你想要让计算机去做一个永远也没法做完的事情。
再短的弧,也是拥有无限多个点的。
[解决办法]
这个你要看源码是怎样实现的,数学上圆上的点是无限的,但计算机上圆上的点是有限的
[解决办法]
啥意思?三角函数是C语言标准库的一部分吧?
或者楼主想要的是圆弧的栅格化?
[解决办法]
楼主好牛,
小弟认为,知道了圆心坐标.半径.起点坐标和终点坐标在根据像素的大小,就可以得到一个变量。其实这个圆弧上所有的点就是一个数列。
愚见: 将起始点(A)和终点(C)的垂直平分线看做Y轴(交点B
,圆心看做原点。然后将AB平分得到一个点(E)而必然关于y轴对称的点(f)一是在这个圆弧上的
如此无限递归下去就可以取到无数个点。不过在计算机中无限的递归下去是不允许的,看你的需求。可以决定递归多少次
[解决办法]
[解决办法]
- C/C++ code
//知道圆心坐标.半径.起点角度和终点角度,如何遍历从起点像素开始逆时针方向到终点像素的所有像素?#include <stdio.h>#include <math.h>#define MAXR 2048.0int xi,yi,xL,yL;double xd,yd;double sa,ea,ga,a;double ox,oy;double r;#ifndef M_PI #define M_PI 3.14159265358979323846#endifvoid main() { while (1) { printf("Input ox oy r sa ea:"); fflush(stdout); rewind(stdin); if (5==scanf("%lf%lf%lf%lf%lf",&ox,&oy,&r,&sa,&ea)) { if (-MAXR< ox && ox< MAXR && -MAXR< oy && oy< MAXR && 0.0< r && r< MAXR && 0.0<=sa && sa<=360.0 && 0.0<=ea && ea<=360.0 && sa< ea) break; else { printf("Input Invalid! MAXR==%d\n" " -MAXR< ox && ox< MAXR \n" "&& -MAXR< oy && oy< MAXR \n" "&& 0.0< r && r< MAXR \n" "&& 0.0<=sa && sa<=360.0 \n" "&& 0.0<=ea && ea<=360.0 \n" "&& sa< ea\n" ); } } } sa=sa*M_PI/180.0; ea=ea*M_PI/180.0; ga=1.0/(r*M_PI*2.0); xL=(int)MAXR; yL=(int)MAXR; for (a=sa;a<ea;a+=ga) { //printf("a=%lg\n",a); xd=r*cos(a)+ox; yd=r*sin(a)+oy; //printf("xd,yd=%lg,%lg\n",xd,yd); xi=(int)floor(xd); yi=(int)floor(yd); //printf("xi,yi=%d,%d\n",xi,yi); if (xi!=xL || yi!=yL) { printf("%5d,%5d\n",xi,yi); xL=xi; yL=yi; } }}
[解决办法]
通常都是用画折线的方式来画圆的。比如规定每5度或是2度画一条直线,用来连接圆弧上的两个点,合起来就是个圆了——看起来是。
只要角度选得足够小,再大的圆也能这样画出来。