2d绘制 c# dx_如何在C#中绘制2D等高线图?

本文介绍如何使用C#在Windows应用程序中绘制2D等高线图。通过将三维点转换为可绘制的GDI线条,实现自定义函数的图形表示。文章详细展示了算法和代码实现,包括坐标转换、等高线轮廓绘制和颜色填充。
摘要由CSDN通过智能技术生成

I'm mainly interested in algorithm which would enable me to convert Point3D[] into drawable gdi lines?

解决方案

Thanks to @Anders Gustafsson I was able to build something:

public partial class FunctionGraph : UserControl

{

private Rectangle _area = new Rectangle(-10, -10, 20, 20);

private Func _func;

public FunctionGraph()

{

SetStyle(

ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer |

ControlStyles.OptimizedDoubleBuffer |

ControlStyles.ResizeRedraw, true);

this.Padding.All=20;

InitializeComponent();

}

public Rectangle Area

{

get { return _area; }

set

{

_area = value;

Invalidate();

}

}

public Func Function

{

get { return _func; }

set

{

_func = value;

Invalidate();

}

}

public PointF GraphToClient(PointF p)

{

var xreal = this.ClientRectangle.Width - this.Padding.All * 2;

var yreal = this.ClientRectangle.Height - this.Padding.All * 2;

int n = (this.ClientRectangle.Width-this.Padding.All*2)/5;

int m = (this.ClientRectangle.Height - this.Padding.All *2) / 5;

return new PointF

{

X = this.Padding.All+p.X/ (xreal / (n * 5)),

Y = this.Padding.All + p.Y / (yreal / (m * 5))

};

}

protected override void OnPaint(PaintEventArgs e)

{

var graphics = e.Graphics;

if (_func != null && !DesignMode&& Enabled)

{

float min = Single.MaxValue;

float max = Single.MinValue;

int n = (this.ClientRectangle.Width-this.Padding.All*2)/5;

int m = (this.ClientRectangle.Height - this.Padding.All *2) / 5;

var pts = new Point3F[n,m];

for (int i = 0; i < n; i++)

{

for (int j = 0; j < m; j++)

{

var xreal = this.ClientRectangle.Width - this.Padding.All * 2;

var yreal = this.ClientRectangle.Height - this.Padding.All * 2;

var pt=new Point3F(this.Padding.All+i * 5,this.Padding.All+ j * 5, _func((i * 5) * (xreal / (n * 5)), (j * 5) * (yreal / (m * 5))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值