2 Преобразования двумерных координат
Задача: Написать программу, демонстрирующую преобразование двумерных координат (перенос, поворот и масштабирование). Вывести график функции до преобразования и после него в одном окне [2].
Решение:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public float transX(float x, float y, float Alfa, float d, float s)
{
return (float)((s * x * Math.Cos(Alfa) + s * y * Math.Sin(Alfa) + d));
}
public float transY(float x, float y, float Alfa, float d, float s)
{
return (float)(-s * x * Math.Sin(Alfa) + s * y * Math.Cos(Alfa) + d);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
float fi, fimin, fimax, xmin, xmax, ymin, ymax, x, y, h, x2, y2;
float tx, ty, Alfa, s;
s = 2;
tx = 10; ty = 7; Alfa = (float)(Math.PI) / 6;
fimin = 0; fimax = (float)(4 * (Math.PI));
h = (fimax - fimin) / 100;
xmin = (float)(F(fimin) * Math.Cos(fimin));
ymin = (float)(F(fimin) * Math.Sin(fimin));
xmax = xmin;
ymax = ymin;
fi = fimin + h;
while (fi < fimax)
{
x = (float)(F(fi) * Math.Cos(fi));
if (x < xmin) xmin = x;
if (x > xmax) xmax = x;
y = (float)(F(fi) * Math.Sin(fi));
if (y < ymin) ymin = y;
if (y > ymax) ymax = y;
x2 = transX(x, y, Alfa, tx, s);
if (x2 < xmin) xmin = x2;
if (x2 > xmax) xmax = x2;
y2 = transY(x, y, Alfa, ty, s);
if (y2 < ymin) ymin = y2;
if (y2 > ymax) ymax = y2;
fi = fi + h;
}
float dx = (xmax - xmin) * 0.03f;
float dy = (ymax - ymin) * 0.03f;
float ax = ClientSize.Width / (xmax - xmin + 2 * dx);
float ay = -ClientSize.Height / (ymax - ymin + 2 * dy);
float bx = -ax * (xmin - dx);
float by = -ay * (ymax + dy);
float hf, wf, a, b, c, d;
float asm = (xmax - xmin) / (ymax - ymin);
float asf = (float)ClientSize.Width / (float)ClientSize.Height;
if (asm > asf)
{
wf = ClientSize.Width;
hf = (ymax - ymin) * wf / (xmax - xmin);
a = 0;
b = (ClientSize.Height - hf) / 2;
c = ClientSize.Width;
d = (ClientSize.Height + hf) / 2;
}
else
{
hf = ClientSize.Height;
wf = (xmax - xmin) * hf / (ymax - ymin);
a = (ClientSize.Width - wf) / 2;
b = 0;
c = (ClientSize.Width + wf) / 2;
d = ClientSize.Height;
}
ax = (c - a) / (xmax - xmin + 2 * dx);
ay = (b - d) / (ymax - ymin + 2 * dy);
bx = a - ax * (xmin - dx);
by = b - ay * (ymax + dy);
g.Transform = new Matrix(ax, 0, 0, ay, bx, by);
float hline = (xmax - xmin) * 0.001f;
Pen blackPen = new Pen(Color.Black, hline);
Pen bluePen = new Pen(Color.Blue, hline);
g.DrawLine(bluePen, xmin, 0, xmax, 0);
g.DrawLine(bluePen, 0, ymin, 0, ymax);
fi = fimin;
while (fi <= fimax)
{
g.DrawLine(blackPen, (float)(F(fi) * Math.Cos(fi)), (float)(F(fi) * Math.Sin(fi)), (float)(F(fi + h) * Math.Cos(fi + h)), (float)(F(fi + h) * Math.Sin(fi + h)));
fi = fi + h;
}
fi = fimin;
while (fi <= fimax)
{
x = (float)(F(fi) * Math.Cos(fi));
y = (float)(F(fi) * Math.Sin(fi));
x2 = (float)(F(fi + h) * Math.Cos(fi + h));
y2 = (float)(F(fi + h) * Math.Sin(fi + h));
g.DrawLine(blackPen, transX(x, y, Alfa, tx, s), transY(x, y, Alfa, ty, s), transX(x2, y2, Alfa, tx, s), transY(x2, y2, Alfa, ty, s));
fi = fi + h;
}
}
private float F(float fi)
{
return 3 * (1 + (float)(Math.Cos(fi)));
}
private void Form1_Resize(object sender, EventArgs e)
{
Invalidate();
}
}
}
Р
исунок
2.1 Реализация программы, демонстрирующей
преобразование
двумерных координат
