【问题标题】:how to draw polygon including negative points ? in C#如何绘制包括负点的多边形?在 C# 中
【发布时间】:2016-10-22 01:14:36
【问题描述】:

我正在做 c# 项目。我发现了一个问题,无法找到这个问题的答案,这就是我在这里发帖的原因/ 我正在用 c# 实现程序平面图生成。首先我需要在给定的点上绘制一个多边形来生成网格。点数可以是正数或负数。点将处于浮动状态。

从 Microsoft 文档中,我能够为浮动的正点绘制多边形,但是当我将点更改为负时,它不会在表单上绘制任何内容。

这个方法id在角落绘制x,y坐标0,0。

代码示例 公共无效 DrawPolygonPointF(PaintEventArgs e) {

// Create pen.
Pen blackPen = new Pen(Color.Black, 3);

// Create points that define polygon.
PointF point1 = new PointF(50.0F,  50.0F);
PointF point2 = new PointF(100.0F,  25.0F);
PointF point3 = new PointF(200.0F,   5.0F);
PointF point4 = new PointF(250.0F,  50.0F);
PointF point5 = new PointF(300.0F, 100.0F);
PointF point6 = new PointF(350.0F, 200.0F);
PointF point7 = new PointF(250.0F, 250.0F);
PointF[] curvePoints =
         {
             point1,
             point2,
             point3,
             point4,
             point5,
             point6,
             point7
         };

// Draw polygon curve to screen.
e.Graphics.DrawPolygon(blackPen, curvePoints);

}

我有负坐标值,例如 pointF(300,-250) 这种方法没有为负坐标值绘制任何内容。 所以请给我一个简单的解决方案,因为我对绘画不太了解。

谢谢

【问题讨论】:

  • 我不确定我是否遵循:您的意思是您需要绘制一个图表,其中 0,0 位于窗口中间,而不是角落?您不能在绘制数字时添加偏移量以表示您在窗口中查看的区域,和/或缩放值吗?
  • 我有正点和负点来绘制多边形。
  • 我想你应该提供一些代码,描述它的结果以及你对它的期望。
  • “负点”是什么意思 - 一些 x,y 坐标带有负值?如果 0,0 是表单的角,您希望 Windows 在绘制这些点时将它们放在哪里? (或者您是否期望多边形的一侧被剪裁,而这不会发生?)
  • TranslateTransform 就是答案。不要操纵数据而是图形视口!

标签: c#


【解决方案1】:

在 C# 中,0,0 是屏幕的左上角。因此负值不在表单的左侧或顶部边缘。您需要将坐标从坐标空间转换为表单的坐标。要放置 0,0 死点,您可以这样做:

int screenX = myX + windowWidth / 2;
int screenY = myY + windowHeight / 2;

【讨论】:

  • 只是为了给那些不知道“转换”是什么意思的人一点帮助,这意味着将这些 x 和 y 值添加到您的每个点上,或者使用一个实际的 GDI 转换,但这有点复杂。这将滑动(平移变换)您的点,使它们相对于窗口的中心。
  • 如果您想了解更多关于“真正的”GDI 转换的信息,可以在 MSDN 上的以下链接中找到它msdn.microsoft.com/en-us/library/6a1d65f4(v=vs.110).aspx
  • @ShHuzaifa 是的,每个点都需要用这些值进行翻译。
  • 这是个坏主意。为什么在可以调整视口时弄乱数据?需要 Graphics.TranslateTranform 和 Graphics.ScaleTransform。
【解决方案2】:

根据@pquest 给出的答案以及您新添加的示例代码,进行“真正的”GDI 转换将如下所示:

// Create pen.
Pen blackPen = new Pen(Color.Black, 3);

// Create points that define polygon.
PointF point1 = new PointF(50.0F,  50.0F);
PointF point2 = new PointF(100.0F,  25.0F);
PointF point3 = new PointF(200.0F,   5.0F);
<...snip...>

//Apply a translation Transformation to move 0,0 to the center of the 
//window.  You can now draw your points with negative values, without doing 
//any addition to them.
int screenX = windowWidth / 2;
int screenY = windowHeight / 2;
e.Graphics.TranslateTransform((float) screenX, (float) screenY);

// Draw polygon curve to screen.
e.Graphics.DrawPolygon(blackPen, curvePoints);

GDI 转换非常强大。您可以使用它们来移动点,水平或垂直翻转点,放大或缩小物体,像平行四边形一样扭曲,甚至进行旋转。所有这些都可以组合成所谓的转换矩阵,以获得一些非常酷的结果。 更多示例请访问MSDN

【讨论】:

  • myX,myY 的值是多少?
  • 啊,对不起,那不属于那里。我忘记了从 pquest 的代码中删除它。我已经按答案更新了。
  • windoWwidth 和 windowHeight 的值是多少?
  • 它们是你的窗口的宽度和高度,因为中心是它的宽度和高度的 1/2。
  • this.ClientSize.Widththis.ClientSize.Height 可能是获得它们的最简单方法。
【解决方案3】:

这对我来说是解决这个问题的。 你只需要在你的代码中添加几行代码。

 int windowWidth = this.ClientSize.Width;
 int windowHeight = this.ClientSize.Height;
 int screenX = windowWidth / 2;
 int screenY = windowHeight / 2;
 e.Graphics.TranslateTransform((float)screenX, (float)screenY);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2015-12-13
    • 2023-03-14
    • 2013-10-13
    • 2020-08-16
    • 2019-11-08
    相关资源
    最近更新 更多