Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ячейки Вороного

49K
14 мая 2009 года
ridiel
1 / / 14.05.2009
Язык: C#
Постановка задачи:
- минимум: вывод на экран 2 окружности, которые можно перемещать мышью, между которыми рисуется гипербола. Центры окружностей - фокусы гиперболы.
- в идеале: вывод на экран ячейки вороного, только вместо точек используются окружности, и в этом случае прямые, которые которые равноудалены от двух соседних точек(в данном случае окружностей) заменяются на гиперболы.
У меня уже есть кое-какие исходники, но гиперболы выводятся неправильно, скорее всего проблема с матрицей поворота.....ПОМОГИТЕ
public partial class Form1 : Form
{
public Form1()
{
//наши три окружности
InitializeComponent();
objects[0] = new GeometricObject(11, new Vector(50.0f, 50.0f), new Vector(100.0f, 0.0f));
objects[1] = new GeometricObject(11, new Vector(70, 70), new Vector(200.0f, 0.0f));
objects[2] = new GeometricObject(11, new Vector(100, 100), new Vector(150.0f, 100.0f));
}

private GeometricObject[] objects = new GeometricObject[3];
private bool[] b_objects = new bool[3];

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
for (int i = 0; i < objects.Length; i++)
b_objects = Math.Sqrt(Math.Pow(e.X - objects.Mid(1), 2.0f) + Math.Pow(e.Y - objects.Mid(2), 2.0f)) <= objects.M_M_(1) / 2.0f;
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
for (int i = 0; i < objects.Length; i++)
{
if (b_objects)
{
objects.Mid_11(1, e.X);
objects.Mid_11(2, e.Y);
}
}
Form1_Paint(sender, null);
}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
for (int i = 0; i < objects.Length; i++)
b_objects = false;
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
using (Graphics g = CreateGraphics())
{
g.TranslateTransform(Width / 2, Height / 2);
g.Clear(Color.White);
g.DrawLine(Pens.Blue, -1000, 0, 1000, 0);
g.DrawLine(Pens.Blue, 0, -1000, 0, 1000);
for (int i = 0; i < objects.Length; i++)
g.DrawEllipse(Pens.Black, objects.Min(1), objects.Min(2), objects.M_M_(1), objects.M_M_(2));

System.Drawing.Drawing2D.GraphicsState state = g.Save();
Giperbola.Draw(g, objects[0], objects[1]);
g.Restore(state);
Giperbola.Draw(g, objects[1], objects[2]);
g.Restore(state);
Giperbola.Draw(g, objects[2], objects[0]);
g.Restore(state);

}
}

private void Form1_Load(object sender, EventArgs e)
{

}
}

public class Giperbola
{
public static void Draw(Graphics g, GeometricObject obj1, GeometricObject obj2)
{
//if (obj1.M_M_(1) > obj2.M_M_(1))
//{
// GeometricObject temp = obj1;
// obj1 = obj2;
// obj2 = temp;
//}

float a = (obj2.M_M_(1) - obj1.M_M_(1)) / 2.0f / 2.0f;
float c2 = (float)Math.Pow(obj2.Mid(1) - obj1.Mid(1), 2.0f) + (float)Math.Pow(obj2.Mid(2) - obj1.Mid(2), 2.0f);
float b2 = c2 - a * a;

float sin = (obj2.Mid(1) - obj1.Mid(1)) / (float)Math.Sqrt(c2);
float cos = (obj2.Mid(2) - obj1.Mid(2)) / (float)Math.Sqrt(c2);
//float an = (float)Math.Asin(sin);
//g.RotateTransform(an);
//System.Drawing.Drawing2D.Matrix m = new System.Drawing.Drawing2D.Matrix((float)Math.Cos(an), -(float)Math.Sin(an), (float)Math.Sin(an), (float)Math.Cos(an), 0.0f, 0.0f);
//матрица поворота
System.Drawing.Drawing2D.Matrix m = new System.Drawing.Drawing2D.Matrix(cos, -sin, sin, cos, 0.0f, 0.0f);
g.MultiplyTransform(m);
g.TranslateTransform((obj2.Mid(1) + obj1.Mid(1)) / 2.0f, (obj2.Mid(2) + obj1.Mid(2)) / 2.0f);

PointF[] points = new PointF[2000];
for (int y = -1000; y < 1000; y ++)
{
points[y + 1000] = new PointF(a * (float)Math.Sqrt(1 + (y) * (y) / b2), y);
}
g.DrawLines(Pens.Red, points);

}
}
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог