繁体   English   中英

如何基于四个旋转和缩放的点绘制椭圆?

[英]How can I draw an ellipse based on four rotated and scaled points?

我从一个完美的圆开始,然后我需要自由旋转和缩放它,而不会失去椭圆的特征:

圆变形

我想知道是否有一种方法可以描述仅基于余弦和正弦的椭圆变形。

我有以下代码:

    float centerX = 100;
    float centerY = 100;
    float radiusX = 100;
    float radiusY = 100;
    float rotation = PI;
    float res = 30;
    for (int i = 0; i < res; i++) {

        //find the point in space for the circle resolution
            float angle = (float)i/res * TWO_PI;

            float x = radiusX * cos(angle);
            float y = -radiusY * sin(angle);

        //rotate the point
            float s = sin(rotation);
            float c = cos(rotation);

            // translate point to origin:
            p->x -= centerX;
            p->y -= centerY;

            float xnew = p->x * c - p->y * s;
            float ynew = p->x * s + p->y * c;

            // translate point back
            x = xnew + centerX;
            y = ynew + centerY;

        //apply X Y
    }

该代码仅表示相同的椭圆,而忽略了旋转和比例之间的关系:

在此处输入图片说明

我使用了几年前在这里问过的相同方法,但是那个时候对正方形进行扭曲是有用的: 在OpenGL中绘制扭曲平面的正确方法是什么?

这是代码:

//setup the four coordinates
float topX = 20;
float topY = 10;

float bottomX = 30;
float bottomY = 20;

float rightX = 30;
float rightY = 20;

float leftX = 30;
float leftY = 20;

//calculate the horizontal radius
float distHorX = rightX-leftX;
float distHorY = rightY-leftY;
float radiusX = sqrt(distHorX * distHorX + distHorY * distHorY)/2.f;

//calculate the vertical radius
float distVerX = topX-bottomX;
float distVerY = topY-bottomY;
radiusY = sqrt(distVerX * distVerX + distVerY * distVerY)/2.f;

float res = 30;
for (int i = 0; i < res; i++) {

        float angle = (float)i/res * TWO_PI;

        float x = radiusX * cos(angle);
        float y = -radiusY * sin(angle);

        //corvert the circle inside a square to a square inside a circle
        //it is a magical number I have found to convert that proportion
        x /= 0.705069124;
        y /= 0.705069124;

        //transform the points based on that four coordinates
        float pctx = (x + radiusX) / (radiusX*2);
        float pcty = (y + radiusY) / (radiusY*2);

        float linePt0x = (1-pcty)* topX + pcty * leftX;
        float linePt0y = (1-pcty)* topY + pcty * leftY;
        float linePt1x = (1-pcty)* rightX + pcty * bottomX;
        float linePt1y = (1-pcty)* rightY + pcty * bottomY;
        float ptx      = (1-pctx) * linePt0x + pctx * linePt1x;
        float pty      = (1-pctx) * linePt0y + pctx * linePt1y;

        //apply X Y
        x = ptx;
        y = pty;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM