#include <winbgim.h>
#include <conio2.h>
#include <cmath>
void ellipseMP(int xcenter,int ycenter,int rx,int ry,float alpha);//alpha :椭圆绕中心点逆时针旋转的角度 (单位:弧度)
void ellipsePoints(int xcenter,int ycenter,int xpt,int ypt,float alpha);
int main()
{
initwindow(640,480); //open a 640x480 graphics window
ellipseMP(320,240,70,30,2.1);
getch(); //wait for user to press a key
closegraph(); //close graphics window
return 0;
}
void ellipseMP(int xcenter,int ycenter,int rx,int ry,float alpha)
{
int x2 = rx * rx,y2 = ry * ry;
int x = 0,y = ry,p;
int px = 0,py = 2 * x2 * y;
ellipsePoints(xcenter,ycenter,x,y,alpha);
/*region1*/
p = y2 - x2 * ry + 0.25 * x2 + 0.5;
while(px < py)
{
x++;
px += 2 * y2;
if(p < 0)
p += y2 + px;//or: p += y2 + 2 * y2 * x;
else
{
y--;
py -= 2 * x2;
p += px + y2 - py;
}
ellipsePoints(xcenter,ycenter,x,y,alpha);
}
/*region2*/
p = y2 * (x + 0.5) * (x + 0.5) + x2 * (y - 1) * (y - 1) - x2 * y2 + 0.5;
while(y > 0)
{
y--;
py -= 2 * x2;
if(p > 0)
p += x2 - py;
else
{
x++;
px += 2 * y2;
p += px + x2 - py;
}
ellipsePoints(xcenter,ycenter,x,y,alpha);
}
}
void ellipsePoints(int xcenter,int ycenter,int xpt,int ypt,float alpha)
{
int x[4],y[4];
//先旋转在四个象限的点
x[0] = xpt * cos(alpha) - ypt * sin(alpha);
y[0] = xpt * sin(alpha) + ypt * cos(alpha);
x[1] = -xpt * cos(alpha) + ypt * sin(alpha);
y[1] = -xpt * sin(alpha) - ypt * cos(alpha);
x[2] = xpt * cos(alpha) + ypt * sin(alpha);
y[2] = xpt * sin(alpha) - ypt * cos(alpha);
x[3] = -xpt * cos(alpha) - ypt * sin(alpha);
y[3] = -xpt * sin(alpha) + ypt * cos(alpha);
//输出四个点
putpixel(xcenter + x[0],ycenter + y[0],RGB(255,0,0));
putpixel(xcenter + x[1],ycenter + y[1],RGB(255,0,0));
putpixel(xcenter + x[2],ycenter + y[2],RGB(255,0,0));
putpixel(xcenter + x[3],ycenter + y[3],RGB(255,0,0));
}
中心法画椭圆(各种大小位置)
最新推荐文章于 2022-03-27 17:17:18 发布