mono c# CairoHelper.Translate

本文关键字:Translate CairoHelper mono | 更新日期: 2023-09-27 18:25:52

使用Cairo;

我在一个更大的矩形里面画了一个矩形,女巫在一个绘图区里面。

我已经设法将一个事件附加到绘图区域,这是我从扩展的对象

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处;宽度=180,高度=100我使用了1/2大小的平移(因为其中一半是复制的),所以这意味着绘图区域正在调整正方形的大小,为了解决这个问题,我保存了位置乘以2的结果,但这不起作用,因为我在绘制的矩形之外得到了"命中"。

最好的方法是什么?我的意思是将X Y位置从窗口转换到绘图区域,我看到这在其他语言中是可能的,但不确定如何在C#和mono绘图区域中做到这一点。

谢谢你的帮助。

mono c# CairoHelper.Translate

我在Cw SDL和C#中用Cairo做过几次这样的操作,基本上,您希望能够将每个矩形的边界框转换为用于在Cairo画布上渲染的坐标。

对于你的每一个矩形,你都会知道你的矩形在他们自己的世界中的位置。我喜欢把它们称为"世界坐标"answers"屏幕坐标"(映射到鼠标所在的位置)。

可以存储每个长方体的世界坐标,然后将它们转换为渲染的每个帧的屏幕坐标。

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()来获取屏幕坐标。然后,你可以用同样的方法来判断你的鼠标是否在世界框的屏幕框中。