C# (графика). афинные преобразования
Primary tabs
Forums:
// ЕСЛИ КОМУ НАДО - ПИШИТЕ, КОД ПОДРОБНО ПРОКОММЕНТИРУЮ
ОКОННОЕ ПРИЛОЖЕНИЕ - на форме рисуется подобие координатных прямых, которые пересекаются строго по центру формы - там считаем начало координат (реализован переход из бумажных координат в экранные). задается прямая (две, три) и при вызове функции ротайт они поворачиваются на угол f относительно начала координат и перерисовываются на форме, сохраняя параллельность.
/
код рабочий, можно прямой сейчас вставлять (только надо поменять вот в этой строке: "namespace grafiks_task3" пространство имен на свое, ну и или создать текстбоксы либо стереть к конце кода методы с ними связанные + еще кнопку создать, либо ее код убрать)
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;
namespace grafiks_task3
{
public partial class Form1 : Form
{
// static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
private Graphics g;
public double F;
public Form1()
{
InitializeComponent();
Paint += new PaintEventHandler(Form1_Paint);
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
g = this.CreateGraphics();
}
// отрисовка фона и координатных осей // для удобства, роли никакой не играет
private void fon()
{
Pen p1 = new Pen(Color.Black);
Brush b1 = new SolidBrush(Color.LightGray);
Brush b2 = new SolidBrush(Color.Red);
int H = Form1.ActiveForm.Size.Height;
int W = Form1.ActiveForm.Size.Width;
int c_x = W / 2;
int c_y = H / 2;
g.FillRectangle(b1, 0, 0, W, H); // фон
g.FillRectangle(b2, c_x, c_y, 5, 5); // центр формы
g.DrawLine(p1, c_x, 0, c_x, H); // координатные оси
g.DrawLine(p1, 0, c_y, W, c_y);
}
// переход от бумажных координат к экранным для рисования на форме
private int X(int x)
{
int H = Form1.ActiveForm.Size.Height;
int W = Form1.ActiveForm.Size.Width;
int c_x = W / 2;
int c_y = H / 2;
x = c_x + x;
return x;
}
private int Y(int y)
{
int H = Form1.ActiveForm.Size.Height;
int W = Form1.ActiveForm.Size.Width;
int c_x = W / 2;
int c_y = H / 2;
y = c_y - y;
return y;
}
//поворот прямой на угол f относительно начала координат
private void rotate(int x1, int y1, int x2, int y2, double f)
{
Pen p1 = new Pen(Color.Black);
double[,] mass = new double[2, 2];
mass[0, 0] = x1;
mass[0, 1] = y1;
mass[1, 0] = x2;
mass[1, 1] = y2;
double[,] Mass = new double[2, 2];
Mass[0, 0] = Math.Cos(f);
Mass[0, 1] = Math.Sin(f);
Mass[1, 0] = -Math.Sin(f);
Mass[1, 1] = Math.Cos(f);
double[,] mass3 = new double[2, 2]; //результат
double sum = 0;
for (int i = 0; i < 2; i++) // умножение
{
for (int j = 0; j < 2; j++)
{
for (int r = 0; r < 2; r++)
{
sum = sum + mass[i, r] * Mass[r, j];
}
mass3[i, j] = sum;
sum = 0;
}
}
x1 = Convert.ToInt32(mass3[0, 0]);
y1 = Convert.ToInt32(mass3[0, 1]);
x2 = Convert.ToInt32(mass3[1, 0]);
y2 = Convert.ToInt32(mass3[1, 1]);
g.DrawLine(p1, X(x1), Y(y1), X(x2), Y(y2)); // отрисовка отрезка
}
// задание прямых и вызов функции поворота
private void draw2()
{
fon();
Pen p1 = new Pen(Color.Black);
double f;
f = 2;
//f = F;
//label1.Text = "f = " + f;
//задание точек отрезка
int x1 = 50;
int y1 = 0;
int x2 = 500;
int y2 = 150;
g.DrawLine(p1, X(x1), Y(y1), X(x2), Y(y2)); // отрисовка отрезка1
rotate(x1, y1, x2, y2, f); // поворот отрезка1
int x3 = 100;
int y3 = 0;
int x4 = 510;
int y4 = 130;
g.DrawLine(p1, X(x3), Y(y3), X(x4), Y(y4)); // отрисовка отрезка2
rotate(x3, y3, x4, y4, f); // поворот отрезка1
////////////////////////////////////////////////
}
private void Form1_Load(object sender, EventArgs e){
// empty
}
private void button1_Click_1(object sender, EventArgs e) {
//string S1 = textBox1.Text;
//string S2 = textBox2.Text;
//double a = 0, b = 0;
//a = Convert.ToDouble(S1);
//b = 0.1 * Convert.ToDouble(S2);
// F = a + b;
draw2();
}
private void button2_Click(object sender, EventArgs e){
draw3();
}
private void label1_Click(object sender, EventArgs e) {
}
private void textBox1_TextChanged(object sender, EventArgs e) {// целая часть угла
}
private void textBox2_TextChanged(object sender, EventArgs e) { // дробная часть угла
}
}/////////// the end
}
- Log in to post comments
- 14691 reads
vedro-compota
Sun, 12/15/2013 - 22:19
Permalink
а что поворачиваешь-то?)
а что поворачиваешь-то?)
_____________
матфак вгу и остальная классика =)
baton
Mon, 12/16/2013 - 20:58
Permalink
)
отрезок, сир.
небольшую прямую, усеченную с двух сторон.