2012-02-25 61 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