2015-12-07 72 views

回答

1

有一些形狀很容易相互轉換。例如,正方形是具有相等邊長的矩形,圓是具有相同軸的橢圓。所以很容易將一個正方形轉換成一個矩形,因爲您可以使用一些drawrectangle函數並以整個方式調整參數。同上圓圈到橢圓。

squaretorect(double width,double height) 
{ 
//Transform a square width * width to a rectangle width * height 
int n = 100;//Number of intermediate points 
int i; 
double currentheight; 
for(i=0;i<n;i++) 
{ 
currentheight = width + (height-width) * i/(n-1); 
drawrectangle(width,currentheight); 
} 
} 

從矩形到橢圓形轉變爲更硬的,因爲在它們之間的形狀既不是矩形也不是橢圓。也許有一些更一般的對象,可以是矩形,橢圓或其他東西,但我想不出來。

所以,簡單的方法是,但有一個更難的方法來做到這一點。假設我將單位圓劃分成N個部分並在橢圓Ei和矩形Ri上寫入點。現在,隨着轉變發生,點Ei移動到點Ri。一個簡單的方法是使用線性組合。

TI =(1-V)* EI + V *日

那麼做,我們慢慢地從0增加v到1的轉變,我們的點Ti的畫線(或更好,但插值)。

ellipsetorectangle(double a, double b, double w, double h) 
{ 
//(x/a)^2+(y/b)^2 = 1 
//Polar r = 1/sqrt(cos(phi)^2/a^2 + sin(phi)^2/b^2) 

int N = 1000; 
int i; 
double phi; double r; 
double phirect = atan(w/h);//Helps determine which of the 4 line segments we are on 
ArrayList<Point> Ei; 
ArrayList<Point> Ri; 
for(i=0;i<N;i++) 
{ 
//Construct ellipse 
phi = 2PI * (double)i/N; 
r = 1/sqrt(cos(phi)^2/a^2 + sin(phi)^2/b^2); 
Ei.add(new Point(r * cos(phi),r * sin(phi)); 

//Construct Rectangle (It's hard) 
if(phi > 2Pi - phirect || phi < phirect) 
{Ri.add(new Point(w/2,w/2 * tan(phi)));} 
else if(phi > phirect) 
{Ri.add(new Point(h/2 * tan(phi),h/2));} 
else if(phi > PI-phirect) 
{Ri.add(new Point(-w/2,-w/2 * tan(phi)));} 
else if(phi > PI+phirect) 
{Ri.add(new Point(-h/2,-h/2 * tan(phi)));} 
} 

} 

Arraylist<Point> Ti; 
int transitionpoints = 100; 
double v; 
int j; 
for(j=0;j<transitionpoints;j++) 
{ 
//This outer loop represents one instance of the object. You should probably clear the picture here. This probably belongs in a separate function but it would take awhile to write it that way. 
for(i=0;i<N;i++)  
{  
v = (double)1 * j/(N-1); 
Ti = new Point(v * Ri.get(i).getx + (1-v) * Ei.get(i).getx, 
    v * Ri.get(i).gety + (1-v) * Ei.get(i).gety); 
if(i != 0) 
drawline(Ti,Tiold); 
Tiold = Ti; 
} 
} 
+0

非常好 - 你能添加一些代碼片段嗎? –

+0

剛剛添加。我還沒有測試過它。 –

+0

哇 - 我希望我可以添加更多的加號 - 非常有價值的答案! –