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