c# - 调整图形大小以适合 PictureBox

标签 c# winforms drawing picturebox

我需要在 C# 中绘制费马螺线。我做到了,但我希望我的绘图填充在 PictureBox 中,无论实际尺寸有多大。

  public void DrawSpiral(double delta, double numCycles, int oX, int oY, SpiralType spiralType, Color color, Graphics g)
  {
        double a = Convert.ToInt32(textBox1.Text);
        Pen p = new Pen(color, 1);
        double prevX = oX;
        double prevY = oY;
        double X = oX;
        double Y = oY;
        double fi = Convert.ToInt32(textBox2.Text); 
        double radius = 0;

        while (fi <= (numCycles * 360))
        {
            fi += delta;
            if (spiralType == SpiralType.FermaPlus)
            {
                radius = a * Math.Sqrt(fi); 
            }
            else if (spiralType == SpiralType.FermaMinus)
            {
                radius = -a * Math.Sqrt(fi);
            }
            prevX = X;
            prevY = Y;
            X = (radius * Math.Cos(fi / 180 * Math.PI)) + oX;
            Y = (radius * Math.Sin(fi / 180 * Math.PI)) + oY;
            g.DrawLine(p, (float)prevX, (float)prevY, (float)X, (float)Y);
        }
    }

 private void DrawButton_Click(object sender, EventArgs e)
 {
        pictureBox1.Refresh();
        Graphics g = pictureBox1.CreateGraphics();
        DrawSpiral(2, 5, 150, 150, SpiralType.FermaPlus, Color.Blue, g);
        DrawSpiral(2, 5, 150, 150, SpiralType.FermaMinus, Color.Red, g);
  }

那么,我应该怎么做才能让我的绘图在 PictureBox 中充满。

最佳答案

这是一种方法:

更改 DrawSpiral 的签名包括 ClientSizePictureBox而不是一些中心坐标:

public void DrawSpiral(double delta, double numCycles, int spiralType, 
                                                       Color color, Graphics g, Size sz)

然后动态计算中心:

 int oX = sz.Width / 2;
 int oY = sz.Height / 2;
 double prevX = oX;
 double prevY = oY;
 double X = oX;
 double Y = oY;

接下来计算因子a :

 a = sz.Width / 2 / Math.Sqrt( numCycles * 360);

最后Paint调用方法事件,传递有效的 Graphics对象:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
    Size sz = pictureBox1.ClientSize;
    DrawSpiral(2, 5, SpiralType.FermaPlus, Color.Blue, g, sz);
    DrawSpiral(2, 5, SpiralType.FermaMinus, Color.Red, g, sz);
}

调整 PictureBox 的大小时它仍然会用相同数量的循环填充该区域..:

enter image description here

一些注意事项:

  • 可以通过首先在 List<Point> points 中收集数据来提高质量和性能然后使用 DrawLines(pen, points.ToArray())

  • 我只使用了 width当我计算因子 a .使用 Math.Min(sz.Width, sz.Height)始终将其放入非方形盒子中!

  • 我保留了您的偏移量计算;但你可以改为 g.TranslateTransform() ..

  • PictureBoxInvalidate/Refresh自身在调整大小时。如果您更改任何参数,请调用 Invalidate去接他们!

关于c# - 调整图形大小以适合 PictureBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42838677/

相关文章:

c# - 将后台 worker 更新为异步等待

Python Qt 绑定(bind) : setCosmetic() and sceneRect(), 边距问题

java - 同时选择两个或多个形状

c# - 从 Windows 应用程序的文本框中抓取文本

c# - 会计数据库模式

python - 创建具有多种颜色的图像并添加文本

c# - 如何处理 NSubstitute 中的委托(delegate)参数

c# - 在不知道 sqlDbType 的情况下将 DBNull.Value 与 SqlParameter 一起使用?

c# - ASP.NET MVC - 如何在登录页面上显示未经授权的错误?

c# - Directory.GetCurrentDirectory() 不返回正确的目录