我想写一个程序,使用户能够绘制几何形状,如圆,三角形,矩形等。
我也希望能够拖放或调整大小/移动以前绘制的形状。
但我不明白的是如何实现以下内容:
当鼠标越过圆圈时,选择圆圈,然后使用一些键使用户能够调整大小/移动它。
我怎么知道鼠标在圆圈上?
我需要检查鼠标坐标和所有圆像素坐标吗?
我在寻找更简单的解决方案。
发布于 2009-12-30 15:35:52
使用WPF图形和多媒体.http://msdn.microsoft.com/en-us/library/ms752061.aspx
Windows演示基金会(WPF)包括对高质量的二维和三维图形、动画和媒体的支持.图形平台的主要功能包括:
矢量图形支持
硬件加速
分辨率和设备无关的图形。
最小屏幕重绘和集成动画系统。
它有你需要的一切-为什么要重新发明轮子?
您需要将对象保持为图形对象本身,以便它们能够响应mouseover事件。一旦你把它们放到一个位图中,那么你就必须从本质上重新发明轮子。
例如,
这是形状的物体:
http://msdn.microsoft.com/en-us/library/ms747393.aspx#shapes
这里是命中测试:
http://msdn.microsoft.com/en-us/library/ms752097.aspx
你也得到了硬件加速,分辨率和设备无关的图形的优势.我不认为你能轻易地实现这一点:)
发布于 2009-12-30 15:43:47
假设你有两个这样的三角形:

var red = new Triangle(new Point(10, 10), new Point(30, 20), new Point(20, 50));
var blue = new Triangle(new Point(0, 10), new Point(20, 20), new Point(10, 30));要表示图片,可以将它们存储在列表中:
var picture = new List<Triangle> { red, blue };当您绘制图片时,您将枚举列表并分别绘制每个三角形。因为red位于列表中的blue之前,所以蓝色三角形覆盖了红色三角形。
foreach (var triangle in picture)
{
DrawTriangle(graphics, triangle);
}为了让用户修改图片,您可以检测按下鼠标左键的坐标。然后,以受人尊敬的顺序枚举列表,并检查三角形中最接近的角。
foreach (var triangle in picture.Reverse())
{
for (int i = 0; i < 3; i++)
{
if (Distance(mouse, triangle.Corner[i]) < 5)
{
// drag corner until mouse is released
return;
}
}
}发布于 2009-12-30 15:50:37
在Office,Visio,PaintShop,所有绘图包中,您都有Z-Order的概念.
你也需要这样的东西。我想知道,如果您有撤消缓冲区,可能会有很多分页到磁盘。SOmething需要考虑。
撤销的缓冲区很重要。除非你没有撤销功能。也许你保存矢量数据或者位图。
此外,缓冲对象被绘制,你的图形卡是真正快速做矢量的用户界面(而不是在内存中)。这取决于您要寻找什么,需要使用什么,需要多少(绘图)对象。双缓冲可能是好的,也可能是坏的。
圆命中测试:-
isInCircle = (((cursorx-circlecentrex)*(cursorx-circlecentrex)+
(cursory-circlecentrey)*(cursory-circlecentrey)) < circleradius)在平面上使用像素坐标。
但重复你的z顺序。SOme图形包,您可以通过Tab-bing或Shift-Tab-bing来选择,也可以选择父对象中的对象的层次结构。并测试最高的Z-命令,以鼠标点击第一。
如果支持移动屏幕上的圆圈和自动滚动编辑区域时,在边缘附近,大量的坐标,计时器和缓冲区的问题需要考虑。国家管理真的很难。
考虑坐标转换(特别是如果编辑区域可缩放/滚动,并且您需要快速到网格、亚像素精度或其他特性等)。
编辑
修正了isInCircle代码片段及其格式。
https://stackoverflow.com/questions/1980741
复制相似问题