如何绘制包含负点的多边形?在c#

本文关键字:多边形 包含负 何绘制 绘制 | 更新日期: 2023-09-27 18:14:18

我正在做c#项目。我发现了一个问题,无法找到这个问题的答案,这就是为什么我在这里发帖/我正在c#中实现程序性平面图生成。首先,我需要在给定的点上画一个多边形来生成网格。点数可以是正的,也可以是负的。

从微软文档,我能够绘制多边形的浮动正点,但当我改变点为负它不画任何形式。

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

代码示例DrawPolygonPointF(PaintEventArgs){

// 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),此方法不会为负坐标值绘制任何内容。请给我一个简短的解决方案,因为我对绘画知之甚少。

谢谢

如何绘制包含负点的多边形?在c#

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

int screenX = myX + windowWidth / 2;
int screenY = myY + windowHeight / 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上找到

这对我解决这个问题很有效。你只需要在你的代码中添加几行代码。

 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);