2009-12-07 53 views
2

我是第一年的程序員。我正在努力創造一個圓形。 (帶圓角的正方形)。創建一個Squircle

到目前爲止,我已經設法得到。我得到了a,b和r的常數。如果有人能幫助我會很感激。我是一個總喜歡這個。所以要好:)

package squircle; 

import java.awt.*; 
import javax.swing.*; 
import java.lang.Math; 

public class Main extends javax.swing.JApplet { 

    public void paint(Graphics g){ 

    // (x-a)^4 + (y-b)^4 = r^4 

    // y = quadroot(r^4 - (x-a)^4 + b)  
    // x values must fall within a-r < x < a+r 

    int[] xPoints = new int[200]; 
    int[] yPoints = new int[200]; 
    int[] mypoints = new int[200]; 

    for(int c = 0; c <200; c++){ 

     int a = 100; 
     int r = 100; 
     int b = 100; 
     double x = c ; 


     double temp = (r*r*r*r); 
     double temp2 = x-a; 
     double temp3 = ((temp2)*(temp2)*(temp2)*(temp2)); 
     double temp6 = Math.sqrt(temp-temp3); 
     double y = (Math.sqrt(temp6) + b); 
     double z = (y*-1)+300; 

     mypoints[c]=(int)z; 

    // if (c>100){ 
    //  y = y*1; 
    // } 
    // else if(c<100){ 
    //  y = y*1; 
    // } 

     xPoints[c]=(int)x; 
     yPoints[c]=(int)y; 


    // change the equation to find x co-ordinates 
    // change it to find y co-ordinates. 

    // r is the minor radius  
    // (a,b) is the location of the centre 

    // a = 100 
    // b = 100 
    // r = 100 
    // x value must fall within 0 or 200 

    } 

    g.drawPolygon(xPoints, yPoints, xPoints.length); 
    g.drawPolygon(xPoints, (mypoints), xPoints.length); 
    } 
} 
+1

請詳細說明您的問題。例如 - 它不繪製,繪製錯誤等等,等等。 – javamonkey79 2009-12-08 00:04:25

+0

問題是它繪製了一個三角形相交的平面圖 – Will 2009-12-08 00:08:47

+0

我必須使用公式。我無法使用drawroundrect() – Will 2009-12-08 00:12:54

回答

4

它是功課還是有一些其他原因爲什麼你不使用Graphics#drawRoundRect()

+0

+1表明明顯:) – javamonkey79 2009-12-08 00:07:06

+0

我必須使用公式。我不能使用drawroundrect()。 我需要存儲兩個不同數組中計算的數字。 x和y。 – Will 2009-12-08 00:13:55

+0

我不確定它是否如此明顯。他試圖畫一個圓形或圓角的方形嗎?這些是兩種不同的形狀,drawRoundRect不能用於繪製一個圓形。也許我應該試着在下一次更好地理解這個問題,並且如果它沒有意義,就不要理它。 – jarnbjo 2009-12-08 00:15:04

4

如果您將此作爲家庭作業提交,則有一些可幫助您的風格元素。 200,100和300的角色是什麼?這些是應該避免的「魔術常量」。他們是相關的還是隻是偶然的他們有這些價值?建議您使用如下符號:

int NPOINTS = 200;

double radius = 100.0 

這將揭示300是否實際上是你想要的值。我沒有檢查過。

個人而言,我不會寫

y*-1 

-y 

,因爲它太容易輸錯了前者。

我也會打印出200點的浮標,看看你是否可以通過眼睛看出錯誤在哪裏。很有可能在計算開始或結束時畫出虛線 - 很容易在出現「末端效應」錯誤的地方忽略或計算兩次。

此外它很便宜的實驗。嘗試從0到100迭代c或0到10或0到198或1到200.你的虛線/三角形是否總是出現?

UPDATE這是我認爲是錯誤的,以及如何解決它。你做出了一個非常自然的圖形錯誤和圍欄錯誤(http://en.wikipedia.org/wiki/Off-by-one_error),很難檢測到錯誤,因爲你的變量名稱選擇不當。

什麼是mypoints?我相信它是一半的圓形 - 如果你叫它bottomHalf那麼那些回覆woulod已經發現問題更快:-)。

你的圖形問題是你正在畫兩個半圓。您正在繪製CLOSED曲線 - 當您到達最後一個點(c == 199)時,通過回到c == 0關閉多邊形。這使得D形。你有兩個D形,一個是凸出的UP和一個DOWN的。每條線都有一條水平線,用於關閉多邊形。

您的柵欄發佈錯誤是您正在繪製從0到199的點。對於要從0到200繪製的半圓。這就是201點!一點的損失意味着你有一條非常傾斜的線。底線從頂部朝相反的方向傾斜。這給你一個非常楔形的形狀,你稱之爲三角形。我猜你的三角形實際上並沒有關閉,而是像一塊餅,但非常鋒利。(下面的代碼可能更漂亮,更緊湊,但是將對稱問題分解爲象限或八分區常常是有用的,使用anngle清除多邊形也很有趣)。

你實際上想要一個多邊形。代碼應該是這樣的:

int NQUADRANT = 100; 
int NPOINTS = 4*NQUADRANT ; // closed polygon 
double[] xpoints = new double[NPOINTS]; 
double[] ypoints = new double[NPOINTS]; 

你方圓形爲100,100,100方圓我在這裏 選擇不同的價值觀,強調他們是不相關的。通過使用符號名稱,您可以輕鬆改變它們。

double xcenter = 500.0; 
double ycentre = 200.0; 
double radius = 100.; 

double deltax = radius/(double) NQUADRANT; 
// let's assume squircle is centered on 0,0 and add offsets later 
// this code is NOT complete or correct but should show the way 
// I might have time later 
for (int i = 0; i < NPOINTS; i++) { 

if (i < NQUADRANT) { 
    double x0 = -radius + i* deltax; 
    double y0 = fourthRoot(radius, x0); 
    x[i] = x0+xcenter; 
    y[i] = y0+ycenter; 

}else if (i < 2*NQUADRANT) { 
    double x0 = (i-NQUADRANT)* deltax; 
    double y0 = fourthRoot(radius, x0); 
    x[i] = x0+xcenter; 
    y[i] = y0+ycenter; 
}else if (i < 3*NQUADRANT) { 
    double x0 = (i-2*NQUADRANT)* deltax; 
    double y0 = -fourthRoot(radius, x0); 
    x[i] = x0+xcenter; 
    y[i] = y0+ycenter; 
}else { 
    double x0 = -radius + (i-3*NQUADRANT)* deltax; 
    double y0 = -fourthRoot(radius, x0); 
    x[i] = x0+xcenter; 
    y[i] = y0+ycenter; 
} 

} 
// draw single polygon 

private double fourthRoot(double radius, double x) { 
    return Math.sqrt(Math.sqrt(radius*radius*radius*radius - x*x*x*x)); 
} 
0

還有一個JavaScript版本here。您可以查看來源和「比較筆記」,以便可能看到您做錯了什麼。

0

好的,經過進一步調查,這裏是爲什麼你得到「三角相交」。繪製多邊形時,繪製點,最後一點連接第一個點,關閉點並製作多邊形。既然你畫了一半它被繪製(然後連接到它自己),然後另一邊也會發生同樣的情況。

作爲測試的這個改變你的最後幾行這樣的:

for(int i = 0; i < yPoints.length; i++) { 
    g.drawString("*", xPoints[ i ], yPoints[ i ]); 
    } 

    for(int i = 0; i < mypoints.length; i++) { 
    g.drawString("*", xPoints[ i ], mypoints[ i ]); 
    } 

// g.drawPolygon(xPoints, yPoints, xPoints.length); 
// g.drawPolygon(xPoints, (mypoints), xPoints.length); 

這是一個有點粗糙,但我想你會明白了吧。這裏有很多解決方案,我個人會嘗試使用Point類的數組,然後在完成時對其進行排序,但我不知道您可以做什麼和不可以做什麼的具體細節。

0

哇,你們是否正在反思這個,或者是什麼!爲什麼不直接使用drawLine()四次繪製矩形的直線部分,然後使用drawArc()繪製圓角?

+2

其實,沒關係。我顯然不知道圓角和圓角矩形的區別。 – 2009-12-08 09:44:08