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
- 13863 reads
vedro-compota
Sun, 12/15/2013 - 22:19
Permalink
а что поворачиваешь-то?)
а что поворачиваешь-то?)
_____________
матфак вгу и остальная классика =)
baton
Mon, 12/16/2013 - 20:58
Permalink
)
отрезок, сир.
небольшую прямую, усеченную с двух сторон.