Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа Онищук 2ВСб-1.doc
Скачиваний:
20
Добавлен:
07.05.2015
Размер:
262.14 Кб
Скачать

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 Реализация программы, демонстрирующей преобразование

двумерных координат