2012-02-25 33 views
1

using Cairo;mono c#CairoHelper.Translate

我在一個更大的矩形內繪製了一個矩形女巫是在一個繪圖區域內。

我已成功地附上事件繪圖區域女巫一個對象我從它擴展

this.AddEvents ((int) EventMask.ButtonPressMask); 

this.ButtonPressEvent += delegate(object o, ButtonPressEventArgs args) { 
    hasInterface(args.Event.X, args.Event.Y); 

    Console.WriteLine("Button Pressed " + args.Event.X + ", " + args.Event.Y); 
}; 

我使用動態繪圖方塊:

cr.Translate(width/2, height/2); 

cr.Rectangle((pX + (i * tmp)) , pY, boxsize, boxsize);  

private void recordPosition(double x, double y) 
{ 
    x = x*2; 
    y = y*2; 
    boxCoordinates.Add(new double[,] 
     { 
      {x, y} 
     } 
    ); // store coords 
} 


List<double,double> boxCoordinates 

所以對於在繪圖區域內,正方形繪製在x = 0,y = 0處,從「外部」的角度來看,它位於x = 90,y = 45; width = 180,height = 100 我正在使用翻譯(因爲這是複製的一半)的大小/ 2,所以這意味着繪圖區域正在做一個正方形的大小調整,以解決這個問題,我保存位置的把它乘以2,但這不起作用,我得到了繪製的矩形之外的「點擊」。

這樣做的最好方法是什麼?我的意思是將X Y位置從窗口翻譯到繪圖區域,我發現這在其他語言中是可行的,但不知道如何在C#中執行此操作,並且從單聲道執行繪圖區域。

感謝您的任何幫助。

回答

1

我已經在C w SDL和C#中用開羅做過幾次了,基本上,您希望能夠將每個矩形的邊界框轉換爲用於渲染的座標開羅畫布。

對於您的每個矩形,您將在自己的世界中擁有矩形的位置。我喜歡將這些稱爲「世界座標」和它們的「屏幕座標」(將其映射到您的鼠標所在的位置)。

您可以存儲每個框的世界座標,然後將它們翻譯爲屏幕顯示您渲染的每個框。

public class Shape { 
    public Point WorldLoc { get; set; } 
} 

你會做所有的物理(如果有的話)WorldLoc值。當你來渲染時,你希望能夠將你的WorldLoc轉換爲ScreenLoc

public class Scene { 
    public double Zoom; 
    public Point Offset; 

    public Point WorldToScreen(Point world){ 
    var p = new Point(); 
    p.x = (world.x - Offset.x) * Zoom; 
    p.y = (world.y - Offset.y) * Zoom; 
    return p; 
    } 
} 

每次在此場景中渲染某物時,都將使用WorldToScreen()獲取屏幕座標。然後,您可以使用相同的方法來確定鼠標是否位於世界箱的屏幕框中。

+0

有一個疑問,邏輯很像我在做什麼,但偏移變量從哪裏來,我的意思是你如何初始化它? 另外,我使用List 來保持形狀的位置,但使得更多的感覺像你做的那樣做,但爲了測試我正在考慮繼續使用List。 – 2012-02-26 21:50:01

+0

偏移將成爲您的視界左上角在您的世界中的位置。保留大量列表對象似乎很浪費。 – IanNorton 2012-02-27 10:30:09

+0

我的意思是更像列表形狀有x和y和有關該對象的其他細節。謝謝你的幫助。 – 2012-02-27 22:58:35