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绘图区域中做到这一点。
谢谢你的帮助。
我在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()来获取屏幕坐标。然后,你可以用同样的方法来判断你的鼠标是否在世界框的屏幕框中。