2012-11-24 45 views
0

我有一個三角形ABC刻成一個圓。點B位於圓的中心,A和C是圓上的兩點。三角座標幾何

enter image description here

鑑於

鑑於AB(長度)

鑑於和B A的COORDS

給定的角度B(角度ABC)

所需

章C

我知道什麼

AB = BC個

查找COORDS,都是半徑的

什麼我用這對

我想提出一個基本的3D的Java遊戲,爲Android。這將用於向左和向右看,所以如果你點擊屏幕的右側部分,對象將通過向角度B增加一度而在你周圍移動。

我試圖尋找C

rect.get(index)[5] = (int) ((di * Math.cos(Math.toRadians(angle-90)))+.5); 
rect.get(index)[6] = (int) ((di * Math.sin(Math.toRadians(angle-90)))+.5); 
rect.get(index)[5] = shapes x coord 
rect.get(index)[6] = shapes y coord 

di = radius length 
angle = angle B 

我添加了.5,這樣當coord被截斷時,它被四捨五入。

我的完整代碼

double di = distance(playerx, playery, rect.get(index)[5], rect.get(index)[6]); 
    double side1 = di; 
    System.out.println("Side1: "+ side1); 
    double side2 = side1; 
    System.out.println("Side2: "+ side2); 
    double side3 = distance(rect.get(index)[5], rect.get(index)[6], playerx, playery+di); 
    System.out.println("Side3: "+ side3); 

    double angle = ((side1*side1)+(side2*side2)-(side3*side3)); 
    angle = angle/(2*side1*side2); 
    angle = Math.acos(angle)*(180/Math.PI); 
    System.out.println("Angle: "+angle); 
    if(playerx > rect.get(index)[5]){ 
     if(lookdirection.equals("left")){ 
      angle += 5; 
     } 
     if(lookdirection.equals("right")){ 
      angle -= 5; 
     } 
    } 
    else{ 
     if(lookdirection.equals("left")){ 
      angle -= 5; 
     } 
     if(lookdirection.equals("right")){ 
      angle += 5; 
     } 
    } 
    System.out.println("Angle: "+angle); 

    rect.get(index)[5] = -(di * Math.cos(Math.toRadians(angle-90))); 
    rect.get(index)[6] = -(di * Math.sin(Math.toRadians(angle-90))); 

    di = distance(playerx, playery, rect.get(index)[5], rect.get(index)[6]); 
    side1 = di; 
    System.out.println("Side1: "+ side1); 
    side2 = side1; 
    System.out.println("Side2: "+ side2); 
    side3 = distance(rect.get(index)[5], rect.get(index)[6], playerx, playery+di); 
    System.out.println("Side3: "+ side3); 
    angle = ((side1*side1)+(side2*side2)-(side3*side3)); 
    angle = angle/(2*side1*side2); 
    angle = Math.acos(angle)*(180/Math.PI); 
    System.out.println("Angle: "+angle); 

    repaint(); 
} 

的角度,現在的工作,但在X和Y COORDS 但

rect.get(index)[5] = -(di * Math.cos(Math.toRadians(angle-90))); 
rect.get(index)[6] = -(di * Math.sin(Math.toRadians(angle-90))); 

都變得非常大/小值。他們應該從點B.留「迪」的距離

+0

那麼,是什麼問題? –

+0

我爲C獲得的電線不正確。 – java

+0

我根據你的描述添加了一張圖片 - 希望它是正確的。 – Ridcully

回答

0

修訂

看來,這是一個幾何問題! 我沒有測試你的代碼,但我猜你想要的是

rect.get(index)[6] = (int) ((di * Math.sin(Math.toRadians(angle-90)))+.5); 

rect.get(index)[6] = (int) (-(di * Math.sin(Math.toRadians(angle-90)))+.5); 

儘量想象自己在做什麼,並檢查下對稱的身份轉變,並週期性here。圖像沿着x軸轉動並反射,現在正在做什麼。您還必須處理舍入問題。如果座標接近0,圖像可能不會移動。

我的建議是,讓您的座標雙打只有一輪他們時,你要它們呈現到像素而不覆蓋其價值

+0

謝謝,由於某種原因,我的角度稍微偏離(.02-.1),即使我停止四捨五入。然後卡住重複: '側面1:101 側面2:101 SIDE3:170 角度:114.61556569086147 角度:115.61556569086147 側面1:101 側面2:101 SIDE3:170 角度:114.61556569086147' – java

+0

那是因爲你繼續四捨五入。你爲什麼不使用雙打?您也可以嘗試打印每個點的座標。如果你有一個像(100,3)這樣的點,並且在旋轉變爲(99.6,3.1)之後,那麼在舍入後它保持不變,並且保持相同的結果。你只需要得到一個整數值,當你必須繪製一個像素 –

+0

我現在正在使用雙打,我有一個新的數組列表,它需要雙打,並將它們整理成整數,然後繪製數組列表。 – java