首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要建议-如何编写绘图程序

需要建议-如何编写绘图程序
EN

Stack Overflow用户
提问于 2009-12-30 15:28:01
回答 5查看 2.9K关注 0票数 4

我想写一个程序,使用户能够绘制几何形状,如圆,三角形,矩形等。

我也希望能够拖放或调整大小/移动以前绘制的形状。

  1. ,我想在面板里画出形状。这看上去合理吗?
  2. ,在我画了一个圆圈之后,它就变成了位图的一部分。当然,我确实将圆的细节保存在其他对象中。

但我不明白的是如何实现以下内容:

当鼠标越过圆圈时,选择圆圈,然后使用一些键使用户能够调整大小/移动它。

我怎么知道鼠标在圆圈上?

我需要检查鼠标坐标和所有圆像素坐标吗?

我在寻找更简单的解决方案。

EN

回答 5

Stack Overflow用户

发布于 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

你也得到了硬件加速,分辨率和设备无关的图形的优势.我不认为你能轻易地实现这一点:)

票数 3
EN

Stack Overflow用户

发布于 2009-12-30 15:43:47

假设你有两个这样的三角形:

代码语言:javascript
运行
复制
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));

要表示图片,可以将它们存储在列表中:

代码语言:javascript
运行
复制
var picture = new List<Triangle> { red, blue };

当您绘制图片时,您将枚举列表并分别绘制每个三角形。因为red位于列表中的blue之前,所以蓝色三角形覆盖了红色三角形。

代码语言:javascript
运行
复制
foreach (var triangle in picture)
{
    DrawTriangle(graphics, triangle);
}

为了让用户修改图片,您可以检测按下鼠标左键的坐标。然后,以受人尊敬的顺序枚举列表,并检查三角形中最接近的角。

代码语言:javascript
运行
复制
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;
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2009-12-30 15:50:37

在Office,Visio,PaintShop,所有绘图包中,您都有Z-Order的概念.

你也需要这样的东西。我想知道,如果您有撤消缓冲区,可能会有很多分页到磁盘。SOmething需要考虑。

撤销的缓冲区很重要。除非你没有撤销功能。也许你保存矢量数据或者位图。

此外,缓冲对象被绘制,你的图形卡是真正快速做矢量的用户界面(而不是在内存中)。这取决于您要寻找什么,需要使用什么,需要多少(绘图)对象。双缓冲可能是好的,也可能是坏的。

圆命中测试:-

代码语言:javascript
运行
复制
isInCircle = (((cursorx-circlecentrex)*(cursorx-circlecentrex)+
  (cursory-circlecentrey)*(cursory-circlecentrey)) < circleradius)

在平面上使用像素坐标。

但重复你的z顺序。SOme图形包,您可以通过Tab-bing或Shift-Tab-bing来选择,也可以选择父对象中的对象的层次结构。并测试最高的Z-命令,以鼠标点击第一。

如果支持移动屏幕上的圆圈和自动滚动编辑区域时,在边缘附近,大量的坐标,计时器和缓冲区的问题需要考虑。国家管理真的很难。

考虑坐标转换(特别是如果编辑区域可缩放/滚动,并且您需要快速到网格、亚像素精度或其他特性等)。

编辑

修正了isInCircle代码片段及其格式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1980741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档