Csharp/C Sharp/2D Graphics/Curve
Версия от 15:31, 26 мая 2010; (обсуждение)
Содержание
Bezier (Mouse Defines Control Points)
using System;
using System.Drawing;
using System.Windows.Forms;
class Bezier: Form
{
protected Point[] apt = new Point[4];
public static void Main()
{
Application.Run(new Bezier());
}
public Bezier()
{
ResizeRedraw = true;
OnResize(EventArgs.Empty);
}
protected override void OnResize(EventArgs ea)
{
base.OnResize(ea);
int cx = ClientSize.Width;
int cy = ClientSize.Height;
apt[0] = new Point( cx / 4, cy / 2);
apt[1] = new Point( cx / 2, cy / 4);
apt[2] = new Point( cx / 2, 3 * cy / 4);
apt[3] = new Point(3 * cx / 4, cy / 2);
}
protected override void OnMouseDown(MouseEventArgs mea)
{
Point pt;
if (mea.Button == MouseButtons.Left)
pt = apt[1];
else if (mea.Button == MouseButtons.Right)
pt = apt[2];
else
return;
Cursor.Position = PointToScreen(pt);
}
protected override void OnMouseMove(MouseEventArgs mea)
{
if (mea.Button == MouseButtons.Left)
{
apt[1] = new Point(mea.X, mea.Y);
Invalidate();
}
else if (mea.Button == MouseButtons.Right)
{
apt[2] = new Point(mea.X, mea.Y);
Invalidate();
}
}
protected override void OnPaint(PaintEventArgs pea)
{
Graphics grfx = pea.Graphics;
grfx.DrawBeziers(new Pen(ForeColor), apt);
Pen pen = new Pen(Color.FromArgb(0x80, ForeColor));
grfx.DrawLine(pen, apt[0], apt[1]);
grfx.DrawLine(pen, apt[2], apt[3]);
}
}
Click on the form to draw curve
using System;
using System.Drawing;
using System.Collections;
using System.ruponentModel;
using System.Windows.Forms;
using System.Data;
using System.Drawing.Drawing2D;
public class Form1 : System.Windows.Forms.Form{
private Point[] thePoints;
private int counter;
public Form1() {
Console.WriteLine("click on the form to draw curve");
InitializeComponent();
thePoints = new Point[1000];
for (int i=0;i<thePoints.Length; i++)
thePoints[i] = new Point(0,0);
counter =0;
}
protected override void OnPaint (PaintEventArgs e) {
if (counter==0)
return;
Pen redPen = new Pen(Color.Red, 3);
Pen greenPen = new Pen(Color.Red, 4);
Point[] curvePoints = new Point[counter];
for (int i=0; i<curvePoints.Length;i++)
{
curvePoints[i] = new Point(0,0);
curvePoints[i].X = thePoints[i].X;
curvePoints[i].Y = thePoints[i].Y;
}
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.DrawCurve(greenPen, curvePoints);
}
private void InitializeComponent() {
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Name = "Form1";
this.Text = "Form1";
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
}
static void Main() {
Application.Run(new Form1());
}
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
thePoints[counter].X = e.X;
thePoints[counter].Y = e.Y;
Label l = new Label();
this.SuspendLayout();
counter++;
if (counter>4)
this.Refresh();
}
}
Draw closed curve
using System;
using System.Drawing;
using System.Collections;
using System.ruponentModel;
using System.Windows.Forms;
using System.Data;
using System.Drawing.Drawing2D;
public class Form1 : System.Windows.Forms.Form{
private Point[] thePoints;
private int counter;
public Form1() {
Console.WriteLine("click on the form to draw closed curve.");
InitializeComponent();
thePoints = new Point[1000];
for (int i=0;i<thePoints.Length; i++)
thePoints[i] = new Point(0,0);
counter =0;
}
protected override void OnPaint (PaintEventArgs e) {
if (counter==0)
return;
Pen redPen = new Pen(Color.Red, 3);
Pen greenPen = new Pen(Color.Red, 4);
Point[] curvePoints = new Point[counter];
for (int i=0; i<curvePoints.Length;i++)
{
curvePoints[i] = new Point(0,0);
curvePoints[i].X = thePoints[i].X;
curvePoints[i].Y = thePoints[i].Y;
}
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.DrawClosedCurve(greenPen, curvePoints);
}
private void InitializeComponent() {
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Name = "Form1";
this.Text = "Form1";
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
}
static void Main() {
Application.Run(new Form1());
}
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
thePoints[counter].X = e.X;
thePoints[counter].Y = e.Y;
Label l = new Label();
this.SuspendLayout();
counter++;
if (counter>4)
this.Refresh();
}
}
Ellipse with DrawLines
using System;
using System.Drawing;
using System.Windows.Forms;
class PolyEllipse: Form
{
public static void Main()
{
Application.Run(new PolyEllipse());
}
public PolyEllipse()
{
Text = "Ellipse with DrawLines";
ResizeRedraw = true;
}
protected override void OnPaint(PaintEventArgs pea)
{
DoPage(pea.Graphics, ForeColor,ClientSize.Width, ClientSize.Height);
}
protected void DoPage(Graphics grfx, Color clr, int cx, int cy)
{
int iNum = 2 * (cx + cy);
PointF[] aptf = new PointF[iNum];
for (int i = 0; i < iNum; i++)
{
double dAng = i * 2 * Math.PI / (iNum - 1);
aptf[i].X = (cx - 1) / 2f * (1 + (float)Math.Cos(dAng));
aptf[i].Y = (cy - 1) / 2f * (1 + (float)Math.Sin(dAng));
}
grfx.DrawLines(new Pen(clr), aptf);
}
}
Sine Curve
using System;
using System.Drawing;
using System.Windows.Forms;
class SineCurve: Form
{
public static void Main()
{
Application.Run(new SineCurve());
}
public SineCurve()
{
Text = "Sine Curve";
ResizeRedraw = true;
}
protected override void OnPaint(PaintEventArgs pea)
{
DoPage(pea.Graphics, ForeColor,ClientSize.Width, ClientSize.Height);
}
protected void DoPage(Graphics grfx, Color clr, int cx, int cy)
{
PointF[] aptf = new PointF[cx];
for (int i = 0; i < cx; i++)
{
aptf[i].X = i;
aptf[i].Y = cy / 2 * (1 -(float)
Math.Sin(i * 2 * Math.PI / (cx - 1)));
}
grfx.DrawLines(new Pen(clr), aptf);
}
}
Spiral
using System;
using System.Drawing;
using System.Windows.Forms;
class Spiral: Form
{
public static void Main()
{
Application.Run(new Spiral());
}
public Spiral()
{
ResizeRedraw = true;
}
protected override void OnPaint(PaintEventArgs pea)
{
DoPage(pea.Graphics, ForeColor,ClientSize.Width, ClientSize.Height);
}
protected void DoPage(Graphics grfx, Color clr, int cx, int cy)
{
const int iNumRevs = 20;
int iNumPoints = iNumRevs * 2 * (cx + cy);
PointF[] aptf = new PointF[iNumPoints];
float fAngle, fScale;
for (int i = 0; i < iNumPoints; i++)
{
fAngle = (float)(i * 2 * Math.PI /(iNumPoints / iNumRevs));
fScale = 1 - (float)i / iNumPoints;
aptf[i].X = (float)(cx / 2 * (1 + fScale * Math.Cos(fAngle)));
aptf[i].Y = (float)(cy / 2 * (1 + fScale * Math.Sin(fAngle)));
}
grfx.DrawLines(new Pen(clr), aptf);
}
}