2015-09-04 74 views
3

我开始了一个完美的圆圈,然后我需要旋转和缩放免费无松弛的椭圆特点:如何基于四个旋转和缩放的点绘制椭圆?

Circle distortion

我想知道是否有描述扭曲像一个椭圆形的方式只基于余弦和正弦。

我有这样的代码:

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 
    } 

此代码只能代表相同椭圆忽略旋转和比例之间的关系:

enter image description here

+2

我想看看仿射变换覆盖所有你想在同一时间做的事情:我知道平移,旋转和缩放 – WorldSEnder

+0

它是不相关的你的问题,但缩放之前旋转圆的优点是什么? – jxh

+0

谢谢@WorldSEnder,我现在试图使用椭圆的焦点,这看起来很有保证。 –

回答

0

我用同样的方法,我在这里几年前就已经问过这个问题了,但是那个时候扭曲方块是有用的: What's the correct way to draw a distorted plane in 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; 
    } 
+0

Javascript版本: https://jsfiddle.net/rjmoo62n/ –