Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Консультации по информатике


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Гаряка Асмик
Статус: Академик
Рейтинг: 7067
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2258
∙ повысить рейтинг »
Лиджи-Гаряев Владимир
Статус: Профессионал
Рейтинг: 1960
∙ повысить рейтинг »

/ НАУКА И ОБРАЗОВАНИЕ / Точные и естественные науки / Информатика

Номер выпуска:207
Дата выхода:07.02.2011, 21:00
Администратор рассылки:Калашников О.А. (Руководитель)
Подписчиков / экспертов:135 / 138
Вопросов / ответов:2 / 2

Вопрос № 182087: Здравствуйте! У меня возникли сложности с таким вопросом: Разработайте алгоритм для решения задачи (блок-схема) Даны координаты вершин треугольника и координаты некоторой точки внутри него. Найдите расстояние от данной точки до ближайшей сторо...


Вопрос № 182088: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Напишите программу для решения задачи на языке программирования VISUAL BASIC SCRIPT (VВScript). 1).Составьте программу, которая определяет, принадлежит ли точка М(x,y) окружности с центром...

Вопрос № 182087:

Здравствуйте! У меня возникли сложности с таким вопросом:
Разработайте алгоритм для решения задачи (блок-схема)
Даны координаты вершин треугольника и координаты некоторой точки внутри него. Найдите расстояние от данной точки до ближайшей стороны треугольника. (При определении расстояния учесть, что площадь треугольника вычисляется и через три его стороны, и через основание и высоту.

Отправлен: 02.02.2011, 20:29
Вопрос задал: Марина (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Абаянцев Юрий Леонидович aka Ayl (Профессионал) :
Здравствуйте, Марина!

Сначала немного геометрии и векторного анализа.
По условию нам заданы координаты вершин треугольника: A(xa;ya), B(xb;yb), C(xc;yc), а также координаты точки O внутри треугольника: O(xo,yo).

Соответственно, мы можем найти следующие вектора по конечным точкам:







и квадраты длин сторон треугольника:




Площадь треугольника определяется либо как половина длины стороны, умноженная на длину опу щенной на нее высоты, либо как половина произведения длин двух сторон, умноженная на синус угла между ними:



Отсюда получаем, что длина высоты выражается следующим образом:

отсюда квадрат высоты будет равен:


Теперь опустим из точки O три перпендикуляра на стороны треугольника и рассмотрим треугольники: AOB, AOC и BOC.
В каждом из них нам известны координаты всех вершин, т.е. мы можем определить и квадраты длин соответствующих высот.
Остается только выбрать из них минимальный (т.к. все длины - неотрицательные, то если квадрат длины одного отрезка больше квадрата длины другого отрезка, то и сама длина первого отрезка больше длины второго отрезка).

Выражение представляет собой векторное произведение дв ух векторов. Результатом операции является вектор, перпендикулярный к плоскости, заданной исходными векторами, при этом координаты вектора определяются с помощью определителя матрицы 3*3.
В данной задаче мы можем считать координату z равной 0, что дает для результирующего вектора координаты (0; 0; xayb-xbya), откуда квадрат длины вектора можно определить как (xayb-xbya)2.

Вот алгоритм решения.

Пишем функцию определения квадрата длины высоты треугольника по координатам вершин (первые 2 координаты задают сторону, на которую опущена высота из вершины, заданной третьей координатой; пишу в синтаксисе Паскаля):

Код:

Type
TPoint = Record
x : Real;
y : Real;
end;

Function H_Len_2 (A, B, C : TPoint) : Real;
var
V1, V2 : TPoint;
begin
V1.x := C.x - A.x; V1.y := C.y - A.y;
V2.x := C.x - B.x; V2.y := C.y - B.y;

H_Len_2 := sqr(V1.x*V2.y-V1.y*V2.x)/(sqr(B.x-A.x)+sqr(B.y-A.y));
end;


Тогда основной блок программы будет выглядеть так:
1. Запрашиваем у пользователя координаты вершин треугольника (A, B, C) и точки O внутри треугольника
2. Заводим переменную для сохранения наименьшего квадрата расстояния от точки O до стороны треугольника (h),
присваиваем ей квадрат расстояния от точки O до стороны AB (с помощью вызова написанной функции с параметрами: A, B, O)
3. Вычисляем квадрат расстояния от точки O до стороны AC (вызов - A, C, O), сравниваем его с h, если он меньше, то заносим его как новое значение h
4. Повторяем шаг 3 для треугольника BCO.5. Выводим результат как квадратный корень из h.

Код:

Var
A, B, C, O : TPoint;
h, h_cur : Real;

Begin
write ('Введите координаты вершины A: '); readln (A.x, A.y);
write ('Введите координаты вершины B: '); readln (B.x, B.y);
write ('Введите координаты вершины C: '); readln (C.x, C.y);
write ('Введите координаты точки O (внутри треугольника): '); readln (O.x, O.y);

h := H_Len_2 (A, B, O);

h_cur := H_Len_2 (A, C, O);
if h_cur < h then h := h_cur;

h_cur := H_Len_2 (B, C, O);
if h_cur < h then h := h_cur;

writeln ('Расстояние от точки O до ближайшей стороны треугольника равно ', sqrt (h_cur));
readln;
End.


Замечание. При расчетах использую квадраты длин, а не сами длины, для того, чтобы избежать выполнения вычисления квадратного корня.
Для данной задачи это не принципиально, но для многих других (в частности, для программ визуализации сцен) это критично, т.к. она медленная и может внести ошибки округления.

Прикладываю блок-схему алгоритма.

Ответ отправил: Абаянцев Юрий Леонидович aka Ayl (Профессионал)
Ответ отправлен: 03.02.2011, 12:55
Номер ответа: 265710
Россия, Санкт-Петербург
Организация: KORUS Consulting
ICQ # 5163321

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 265710 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Вопрос № 182088:

    Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
    Напишите программу для решения задачи на языке программирования VISUAL BASIC SCRIPT (VВScript).

    1).Составьте программу, которая определяет, принадлежит ли точка М(x,y) окружности с центром в точке Z(а,b) и радиусом r.

    2) Напишите программу, которая находит квадратный корень произведения двух вещественных чисел одинакового знака.

    Отправлен: 02.02.2011, 20:31
    Вопрос задал: Марина (Посетитель)
    Всего ответов: 1
    Страница вопроса »


    Отвечает lamed (Профессор) :
    Здравствуйте, Марина! Ответ на первую задачу. Поскольку вещественные числа, избегаем точного сравнения. Модуль разности квадрата расстояния от точки до центра и квадрата радиуса не должен превышать eps. Проверено в IE7
    Код:
    <HTML>
    <HEAD>
    <SCRIPT LANGUAGE="VBScript">
    dim a, b, x, y, r
    dim eps
    eps=0.001
    a=CDbl(inputbox("a="))
    b=CDbl(inputbox("b="))

    x=CDbl(inputbox("x="))
    y=CDbl(inputbox("y="))
    r=CDbl(inputbox("r="))

    if abs((a-x)^2+(b-y)^2-r^2)<=eps then
    msgbox("Принадлежит")
    else
    msgbox("Не принадлежит")
    end if</SCRIPT>
    </HEAD>
    <body>
    </body>
    </HTML>


    Добавлен ответ на вопрос 2.
    Код:
    <HTML>
    <HEAD>
    <SCRIPT LANGUAGE="VBScript">
    dim a, b, c
    a=CDbl(inputbox("a="))
    b=CDbl(inputbox("b="))

    if (a<0) and (b>0) or (a>0) and (b<0) then
    msgbox("Числа разного знака")
    else
    c=sqr(a*b)
    msgbox("sqr(a*b)=" & c)
    end if
    </SCRIPT>
    </HEAD>
    <body>
    </body>
    </HTML>

    Удачи!

    Ответ отправил: lamed (Профессор)
    Ответ отправлен: 02.02.2011, 20:49
    Номер ответа: 265706
    Россия, Ковров
    Тел.: +79107793141
    Организация: КГТА

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 265706 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное