【问题标题】:c# drawing library calculate ranges and midpoints to draw and circlec#绘图库计算范围和中点来绘制和圆
【发布时间】:2019-02-13 00:53:41
【问题描述】:

基本上我有一个菜单,用户可以选择要绘制的形状,然后用户点击两个点,在这两点之间,将绘制所选形状。
我做了以这种方式计算的 Square

// calculate ranges and mid points
xDiff = oppPt.X - keyPt.X;
yDiff = oppPt.Y - keyPt.Y;
xMid = (oppPt.X + keyPt.X) / 2;
yMid = (oppPt.Y + keyPt.Y) / 2;

// draw square
g.DrawLine(blackPen, (int)keyPt.X, (int)keyPt.Y,
    (int)(xMid + yDiff / 2), (int)(yMid - xDiff / 2));
g.DrawLine(blackPen, (int)(xMid + yDiff / 2), (int)(yMid - xDiff / 2),
    (int)oppPt.X, (int)oppPt.Y);
g.DrawLine(blackPen, (int)oppPt.X, (int)oppPt.Y,
    (int)(xMid - yDiff / 2), (int)(yMid + xDiff / 2));
g.DrawLine(blackPen, (int)(xMid - yDiff / 2),
    (int)(yMid + xDiff / 2), (int)keyPt.X, (int)keyPt.Y);

但我不知道如何以相同的方式绘制圆形和三角形

请指教,谢谢

【问题讨论】:

  • 画一个圆你应该使用DrawEllipse;画一个三角形……好吧,你怎么能只知道两点就画一个三角形?
  • @Marco 我知道,但问题是如何根据 Windows 窗体上的用户鼠标点击事件计算大小
  • 在你的 square 函数上你已经有 oppPtkeyPt 了,他们不是用户选择的点吗?
  • 他们是,我设法画出正方形,我试图找到方程来使用这些选定的点来画一个圆和三角形
  • 避免对一个 DrawLines commead 执行多个 DrawLine 命令。对于封闭的矩形,请使用 DrawRectangle。对于三角形使用 DrawPolygon !

标签: c# system.drawing


【解决方案1】:

同路。

int left = 20, top = 20
int right = 100, bot = 100;

// triangle
g.DrawLine(Pens.Red, left, bot, right, bot);
g.DrawLine(Pens.Red, right, bot, left + (right-left) / 2 /* was miss calc */, top);
g.DrawLine(Pens.Red, left + (right - left) / 2, top, left, bot);  // better looks
//g.DrawLine(Pens.Red, left, bot, left + (right-left) / 2 /* was miss calc */, top);

// circle
int len = (right - left) / 2;
int centerX = left + (right - left) / 2, centerY = top + (bot - top) / 2;
for (int i = 0; i <= 360; i++)
{
    int degrees = i;
    double radians = degrees * (Math.PI / 180);

    int x = centerX + (int)(len * Math.Cos(radians));
    int y = centerY + (int)(len * Math.Sin(radians));
    e.Graphics.FillRectangle(Brushes.Red, x, y, 1, 1); // single pixel drawing
}

但椭圆更难

http://www.petercollingridge.co.uk/tutorials/computational-geometry/finding-angle-around-ellipse/

上面的链接是 Ellipse 的帮助

【讨论】:

  • 只有当他真的想要一个旋转的椭圆时。即使这样,也建议改为旋转图形对象..
  • @TaW 如果您说的是 GraphicsPath,我同意您的评论。但他看起来是个新手。所以这种方式比较清楚。
  • @서강원 它正在工作,但我不是只在左上角工作的三角形,因为 X 和 Y 在你的答案中设置为 20 ,20
  • @user22387 我错过了计算:D
  • 我的意思是这两行 int left = 20, top = 20 int right = 100, bot = 100;
【解决方案2】:

要画一个圆,使用g.DrawEllipse,这是一个很好的扩展方法:

public static void DrawCircle(Graphics g, Pen pen, float centerX, float centerY, float radius)
{
    g.DrawEllipse(pen, centerX - radius, centerY - radius, radius + radius, radius + radius);
}

要绘制填充,只需将DrawEllipse 更改为FillElipse 并将Pen 更改为Brush

public static void DrawCircleFilled(Graphics g,  Brush brush, float centerX, float centerY, float radius)
{
    g.FillEllipse(brush, centerX - radius, centerY - radius, radius + radius, radius + radius);
}

如果你坚持只用线条来绘制形状,那么不要害怕。三角形就是简单的用三条线画出来的,很简单,这里就不写了。至于圈子:

圆由若干段组成,段越多,圆的质量越好。你可以从一个简单的三角形开始,然后再添加一条线,你有一个正方形,然后是五边形、六边形等等。每条线的形状在光学上更像是一个圆形。

如您所见,每条线覆盖 (360 / N) 个总角度。因此,您可以使用 for 循环来绘制所有线段(线)。

【讨论】:

  • 感谢您的回复,但我还是个初学者,对我来说有点困惑
  • 不,没有帮助
  • @LarsTech 来自 OP 的第一条评论我认为他/她已经解决了这个问题,并将其描述为“这对我来说有点令人困惑 [问题] [但我现在已经解决了]”跨度>
【解决方案3】:

如果用两点((x1,y1),(x2,y2)) 指定圆的直径, 然后将 DrawEllipse 与 x,y,w,h 一起使用

x = cx-r

y = cy-r

d = w = h = sqrt((x2-x1)^2+(y2-y1)^2)

在哪里

cx = |x2-x1|/2

cy = |y2-y1|/2

r = d/2

对于三角形,您确实需要三个点。您可以将其限制为两个点,就像指定直角三角形的斜边一样。但这仍然是不够的信息,因为有两个直角三角形可能有斜边,上边和下边。你想要什么样的三角形?对、等、锐角、等边、钝角?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2011-05-10
    • 2021-08-04
    相关资源
    最近更新 更多