Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2013, 19:39   #1
includer
 
Регистрация: 29.01.2013
Сообщений: 8
По умолчанию Рисование треугольника с описанной окружностью

Вообщем нужно нарисовать такую фигуру как во вложении 1, накорябав такой код, рисует что то не совсем то(Вложение 2)...Кто бы направил в нужное русло....
Используется .Net, язык С#.

Код:
internal class CustomFigure : Triangle{
        internal  void Init(int X1, int Y1, int X2, int Y2, int X3, int Y3, Color color, Control control) {
            base.Init(X1, Y1, X2, Y2, X3, Y3, color, control);
        }

        internal override void Hide() {
            base.Hide();            
        }

        internal override void Draw() {
            base.Draw();

            double sideLen1 = SideLength((double)fX, (double)fY, (double)fX1, (double)fY1);
            double sideLen2 = SideLength((double)fX1, (double)fY1, (double)fX2, (double)fY2);
            double sideLen3 = SideLength((double)fX2, (double)fY2, (double)fX, (double)fY);

            double p = (Perimeter(sideLen1, sideLen2, sideLen3)) / 2;
            double sqare = Sqare(sideLen1, sideLen2, sideLen3);
            double radius = Radius(sqare, sideLen1, sideLen2, sideLen3);

            //Середины сторон
            double middleX1 = (fX + fX1) / 2;
            double middleY1 = (fY + fY1) / 2;

            double middleX2 = (fX1 + fX2) / 2;
            double middleY2 = (fY1 + fY2) / 2;

            //Перпендикуляры
            //поворачиваем точку fX2, fY2 вокруг середины стороны s2 на угол 90 градусов
            double x1 = fX2; double y1 = fY2;
            x1 -= middleX2; y1 -= middleY2;

            double bX1 = x1 * Math.Cos(Math.PI / 2) - y1 * Math.Sin(Math.PI / 2);
            double bY1 = x1 * Math.Sin(Math.PI / 2) + y1 * Math.Cos(Math.PI / 2);

            bX1 += middleX2; bY1 += middleY2;
            double vX1 = bX1 - middleX2; double vY1 = bY1 - middleY2;

            //поворачиваем точку fX,fY вокруг середины стороны s1 на угол 90 градусов
            x1 = fX; y1 = fY;//временные переменные
            x1 -= middleX1; y1 -= middleY1;

            double bX2 = x1 * Math.Cos(Math.PI / 2) - y1 * Math.Sin(Math.PI / 2);
            double bY2 = x1 * Math.Sin(Math.PI / 2) + y1 * Math.Cos(Math.PI / 2);

            bX2 += middleX1; bY2 += middleY1;
            double vX2 = bX2 - middleX1; double vY2 = bY2 - middleY1;

            DescrCircle(radius, (int)middleX1, (int)middleY1, (int)middleX2, (int)middleY2, vX2, vY2, vX1, vY1);                        
        }

        private double SideLength(double beginX, double beginY, double endX, double endY) {
            return (Math.Sqrt((endX - beginX) / 10 * (endX - beginX) / 10 + (endY - beginY) / 10 * (endY - beginY) / 10)) * 10;
        }

        private double Perimeter(double sideLen1, double sideLen2, double sideLen3) {
            return (sideLen1 + sideLen2 + sideLen3);
        }

        private double Sqare(double s1, double s2, double s3) {            
            double p = (Perimeter(s1, s2, s3)) / 2;
            return Math.Sqrt((p * (p - s1) * (p - s2) * (p - s3)));
        }

        private double Radius(double sqare, double sideLen1, double sideLen2, double sideLen3) {
            return (sideLen1 * sideLen2 * sideLen3) / (4 * sqare);
        }

        private void DescrCircle(double R, int x01, int y01, int x02, int y02, double l1, double m1, double l2, double m2) {
            double X, Y;
            if ((l1 != 0) && ((m1 / l1) - (m2 / l2) != 0) && (l2 != 0)) {
                X = ((m1 / l1) * x01 - y01 - (m2 / l2) * x02 + y02) / ((m1 / l1) - (m2 / l2));
                Y = (m1 * X - m1 * x01 + l1 * y01) / l1;                
                fGraph.DrawEllipse(new Pen(fColor), (int)X, (int)Y, 1, 1);
                fGraph.DrawEllipse(new Pen(fColor), (int)X - (float)R, (int)Y - (float)R, (float)R * 2, (float)R * 2);
            }
        }
    }
Изображения
Тип файла: png vvv.png (972 байт, 91 просмотров)
Тип файла: png custom.png (1.6 Кб, 90 просмотров)

Последний раз редактировалось includer; 29.01.2013 в 19:41.
includer вне форума Ответить с цитированием
Старый 30.01.2013, 14:57   #2
ep1a
Пользователь
 
Регистрация: 30.01.2013
Сообщений: 12
По умолчанию

подсказка:
Цитата:
центр описанной около треугольника окружности лежит в точке пересечения серединных перпендикуляров...
ну как? направил? =)
ep1a вне форума Ответить с цитированием
Старый 30.01.2013, 18:04   #3
includer
 
Регистрация: 29.01.2013
Сообщений: 8
По умолчанию

Цитата:
Сообщение от ep1a Посмотреть сообщение
подсказка:

ну как? направил? =)
[QUOTE=includer;1174751]
Код:
            //Перпендикуляры
            //поворачиваем точку fX2, fY2 вокруг середины стороны s2 на угол 90 градусов
            double x1 = fX2; double y1 = fY2;
            x1 -= middleX2; y1 -= middleY2;

            double bX1 = x1 * Math.Cos(Math.PI / 2) - y1 * Math.Sin(Math.PI / 2);
            double bY1 = x1 * Math.Sin(Math.PI / 2) + y1 * Math.Cos(Math.PI / 2);

            bX1 += middleX2; bY1 += middleY2;
            double vX1 = bX1 - middleX2; double vY1 = bY1 - middleY2;

            //поворачиваем точку fX,fY вокруг середины стороны s1 на угол 90 градусов
            x1 = fX; y1 = fY;//временные переменные
            x1 -= middleX1; y1 -= middleY1;

            double bX2 = x1 * Math.Cos(Math.PI / 2) - y1 * Math.Sin(Math.PI / 2);
            double bY2 = x1 * Math.Sin(Math.PI / 2) + y1 * Math.Cos(Math.PI / 2);

            bX2 += middleX1; bY2 += middleY1;
            double vX2 = bX2 - middleX1; double vY2 = bY2 - middleY1;
Как бы это я и делал тут....
includer вне форума Ответить с цитированием
Старый 30.01.2013, 18:21   #4
Develop
Пользователь
 
Регистрация: 26.06.2010
Сообщений: 52
По умолчанию

Вот нашел у себя в архиве.
Функция рассчитывает центр описанной окружности для треугольника, заданного тремя точками на плоскости.
100% рабочая, так как использовал ее для построения триангуляции Делоне.
Код:
function TriangleCircumcenter2D(triV0, triV1, triV2: TVector2f): TVector2f;
var X1, X2, Y1, Y2, A, L10, L20: single;
begin
  X1:= triV1.x - triV0.x;
  X2:= triV2.x - triV0.x;
  Y1:= triV1.y - triV0.y;
  Y2:= triV2.y - triV0.y;

  L10:= X1*X1 + Y1*Y1;
  L20:= X2*X2 + Y2*Y2;

  A:= 0.5*(X1*Y2 - X2*Y1);
  A:= 1/(4*A);

  Result.x:= triV0.x + (Y2*L10 - Y1*L20) * A;
  Result.y:= triV0.y + (X1*L20 - X2*L10) * A;
end;
З.Ы. код делфи, ну разобраться там не сложно.
Develop вне форума Ответить с цитированием
Старый 30.01.2013, 20:49   #5
includer
 
Регистрация: 29.01.2013
Сообщений: 8
По умолчанию

Develop, спасибо за подсказку...Но все равно что то не то((
Изображения
Тип файла: png Untitled.png (2.0 Кб, 65 просмотров)

Последний раз редактировалось includer; 30.01.2013 в 21:01.
includer вне форума Ответить с цитированием
Старый 30.01.2013, 21:15   #6
ep1a
Пользователь
 
Регистрация: 30.01.2013
Сообщений: 12
По умолчанию

если честно я не смотрел ваши листинги, но можно подойти скорее всего не с самой удачной стороны и решить так: ищем уравнение прямой (стороны), скалярное произведение равно нулю итд, потом находим уравнение прямой серединного перпендикуляра, аналогично находим уравнение прямой другого серединного перпендикуляра и находим точку пересечения. слишком толсто,да? =(


зы: нашел интересную статью:
algolist.manual.ru/maths/geom/equation/circle.php

зызы: на данном сайте много чего полезного имеется

Последний раз редактировалось ep1a; 30.01.2013 в 22:05.
ep1a вне форума Ответить с цитированием
Старый 30.01.2013, 21:52   #7
includer
 
Регистрация: 29.01.2013
Сообщений: 8
По умолчанию

Уф...Все...Разобрался. Щас все корректно рисуется...
ep1a, а статья и впрямь интересная!

Спасибо откликнувшимся!
includer вне форума Ответить с цитированием
Старый 30.01.2013, 22:02   #8
ep1a
Пользователь
 
Регистрация: 30.01.2013
Сообщений: 12
По умолчанию

includer, и все-таки - какой способ был выбран?
ep1a вне форума Ответить с цитированием
Старый 30.01.2013, 22:37   #9
includer
 
Регистрация: 29.01.2013
Сообщений: 8
По умолчанию

ep1a, нашел косяк у себя в коде, а для определения центра использовал алгоритм Develop.
Щас делаю 2 реализацию с помощью статьи по вашей ссылке.

Знание нескольких алгоритмов решения будет полезно при сдаче

PS Кстати, полезный сайт с алгоритмами

Последний раз редактировалось includer; 30.01.2013 в 22:41.
includer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование треугольника по заданной длине стороны и двум углам Determinant666 Общие вопросы Delphi 1 18.09.2012 23:37
(Pascal) Построение треугольника через радиус описанной окружности. Pinosol Помощь студентам 1 23.02.2012 20:29
Рисование одноцветного треугольника <DefendeR> Общие вопросы C/C++ 0 26.05.2011 01:16
рисование треугольника ArniLand Общие вопросы C/C++ 13 31.01.2011 01:53
Делфи. Рисование треугольника Skrip Помощь студентам 3 23.12.2009 23:11