mono c#CairoHelper.Translate
问题描述:
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#中执行此操作,并且从单声道执行绘图区域。
感谢您的任何帮助。
答
我已经在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()获取屏幕坐标。然后,您可以使用相同的方法来确定鼠标是否位于世界箱的屏幕框中。
有一个疑问,逻辑很像我在做什么,但偏移变量从哪里来,我的意思是你如何初始化它? 另外,我使用List来保持形状的位置,但使得更多的感觉像你做的那样做,但为了测试我正在考虑继续使用List。 –
2012-02-26 21:50:01
偏移将成为您的视界左上角在您的世界中的位置。保留大量列表对象似乎很浪费。 – IanNorton 2012-02-27 10:30:09
我的意思是更像列表形状有x和y和有关该对象的其他细节。谢谢你的帮助。 –
2012-02-27 22:58:35