IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Высоты треугольника
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: -  0  +


Здравствуйте. Здесь часть программки,которая рисует треугольник и его высоты. Проблема в одном: там строчка выделена. Почему,когда g1=l она не переходит к выполнению условия??? Все пробую....скажите,где ошибка???Заранее благадарю!
Код
procedure TForm1.Button3Click(Sender: TObject);
const picScale = 10;
var
ma_x, ma_y, mb_x, mb_y, mc_x, mc_y: integer;
ha_x, ha_y, hb_x, hb_y, hc_x, hc_y: integer;
ba_x, ba_y, bb_x, bb_y, bc_x, bc_y: integer;
i,j,m:integer;
          k1,k2,k3,z1,z2,z3:integer;   {integer}
          p,a,b,c:real;
          g1,g2,l:{extended}real;
          Xh, Yh, Zh: integer;

begin
  with paintbox1.Canvas do begin
    pen.Color := clBlack;
    moveto(picScale*strtoint(edit1.Text), picScale*strtoint(edit2.Text));
    lineto(picScale*strtoint(edit3.Text), picScale*strtoint(edit4.Text));
    lineto(picScale*strtoint(edit5.Text), picScale*strtoint(edit6.Text));
    lineto(picScale*strtoint(edit1.Text), picScale*strtoint(edit2.Text));
pen.Color := clGreen;
    k1:=10*strtoint(edit1.Text);
   k2:=10*strtoint(edit3.text);
    k3:=10*strtoint(edit5.text);
  z1:=10*strtoint(edit2.text);
   z2:=10*strtoint(edit4.text);
    z3:=10*strtoint(edit6.text);
  a:= sqrt(sqr(k1-k2)+sqr(z1-z2));
  b:= sqrt(sqr(k2-k3)+sqr(z2-z3));
  c:= sqrt(sqr(k1-k3)+sqr(z1-z3));
  p:=(a+b+c)/2;


{g1:= abs(sqrt(sqr(i-k2)+sqr(j-z2))); }
  g2:= (2*sqrt(p*(p-a)*(p-b)*(p-c)))/c;
  l:=abs(g2);
    for i:=k1 to k3 do
    begin
    for j:=z1 to z3 do
    begin
     g1:= sqrt(sqr(i-k2)+sqr(j-z2));
      if (g1=l) then   {почему,когда g1=l она не переходит к выполнению условия???}
       begin
        Xh := i;
        Yh := j;  
       end;
       end; end;
       moveto(10*strtoint(edit3.Text), picScale*strtoint(edit4.Text));
    lineto(Xh, Yh);


Сообщение отредактировано: Глюк -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Потому, что нельзя сравнивать вещественные числа напрямую... Сравнивай с погрешностью:

If abs(g1 - L) < 0.001 Then ...


Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 22.04.2007 21:08) *

Потому, что нельзя сравнивать вещественные числа напрямую... Сравнивай с погрешностью:

If abs(g1 - L) < 0.001 Then ...



unsure.gif
может что-то не так в самом тексте? Он иногда правильно высоту рисует,а иногда - нет...Он что-то не учитывает?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Глюк @ 22.04.2007 23:30) *
может что-то не так в самом тексте? Он иногда правильно высоту рисует,а иногда - нет...Он что-то не учитывает?
Глюк, я попытался разобраться с твоим текстом, и кажется, мне это удалось..
Ты выбрал крайне странный способ рисования. Ты считаешь высоту как удвоенную площадь (по формуле Герона) делить на сторону. А дальше ты делаешь очень странную вещь.. Ты проходишь циклом по прямоугольнику, натянотому на сторону, и берешь в нем последнюю точку, где выполняется (приблизительное) равенство h=l , где l - это расстояние от вершины до сканируемой точки прямоугольника. Метод - хоть сейчас в кунсткамеру.. smile.gif Типа - машина железная, пусть считает - так, что ли?

Во-первых, этот метод сам по себе неверный (в этом множестве есть нужная точка, но она не последняя).
Во-вторых, подумай, что будет, если, например, k1>k3 (то есть точка А лежит правее С) ?
Или, скажем, если высота проходит вне треугольника?

Мой совет: рассчитай точку основания высоты по-человечески и не городи огород в чистом поле.. Не нужны тут циклы - ни двойные, ни одинарные.. smile.gif

PS
на будущее, когда задаешь такой вопрос, объясняй в общих чертах свой алгоритм. Продраться через твой причудливый код было непросто. Если ты изложишь алгоритм (как я сделал), то вероятность, скорость и правильность ответа тебе значительно повысятся.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: -  0  +


Цитата(Lapp @ 23.04.2007 8:34) *



Во-первых, этот метод сам по себе неверный (в этом множестве есть нужная точка, но она не последняя).
Во-вторых, подумай, что будет, если, например, k1>k3 (то есть точка А лежит правее С) ?
Или, скажем, если высота проходит вне треугольника?

Мой совет: рассчитай точку основания высоты по-человечески и не городи огород в чистом поле.. Не нужны тут циклы - ни двойные, ни одинарные.. smile.gif




а каким тогда способом можно найти точку,куда будет опущена высота?Я много чего просмотрел, ничего нормального не нашел?Может подскажете?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Глюк @ 23.04.2007 10:14) *

а каким тогда способом можно найти точку,куда будет опущена высота?Я много чего просмотрел, ничего нормального не нашел

Ну, например, так:
Высота из угла А делит противоположную сторону (a) на две части: а1 (при С) и а2 (при В).
По теореме Пифагора имеем:
a1^2 + h^2 = b^2
Отсюда находим а1.
После этого остается некоторая неопределенность, в какую сторону от С откладывать этот кусок. Для проверки этого можно посчитать а2 (аналогично). Дальше нужно сделать примерно следующее..
Если a1+a2 = a - откладываем внутрь треугольника.
Если a1+a2 > a , то
- если a1>a2 , то внутрь;
- в противном случае - наружу.
Проверь логику, я не совсем уверен..

Добавлено через 12 мин.
Вот, нарисовал картинки.. smile.gif Прикрепленное изображение


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: -  0  +


Цитата(Lapp @ 23.04.2007 9:43) *

Ну, например, так:
Высота из угла А делит противоположную сторону (a) на две части: а1 (при С) и а2 (при В).
По теореме Пифагора имеем:
a1^2 + h^2 = b^2
Отсюда находим а1.
После этого остается некоторая неопределенность, в какую сторону от С откладывать этот кусок. Для проверки этого можно посчитать а2 (аналогично). Дальше нужно сделать примерно следующее..
Если a1+a2 = a - откладываем внутрь треугольника.
Если a1+a2 > a , то
- если a1>a2 , то внутрь;
- в противном случае - наружу.
Проверь логику, я не совсем уверен..



спасибо.Но, а как можно отложить отрезок,зная только его длину и незная его координат? unsure.gif
опять-таки меня тянет на цикл и поиск координат наабу?Но вы говорите,что их не рекомендовано использовать в этом случае?Других предположений у меня нет... unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Глюк @ 23.04.2007 19:46) *

как можно отложить отрезок,зная только его длину и незная его координат?

Рисуй на листе бумаги параллельно с моими пояснениями.
У нас есть система координат - оси Х и У.
Далее, у тебя есть две точки: B (Bx,By) и C (Cx,Cy)

Делаем два преобразования системы координат:
1. Параллельный перенос (красные стрелки), такой, что т.В переходит в В', совпадающую с началом координат.
2. Поворот (зеленая стрелка) на минус угол, который составляет ВС с осью Х (назовем этот угол Т, от слова Тета, поворот производим на минус Т). После этого В"С" лежит вдоль оси Х.
Откладываем по оси Х нужную длину (от В", то есть от нуля). Внутрь треугольника - с плюсом, наружу - с минусом. Получаем точку О" с координатами (а1,0) - то есть по Х откладываем длину, по У не смещаемся.

Теперь выполняем те же самые преобразования в обратном порядке (все синими стрелками).
1. Поворот на плюс Т.
2. Параллельный перенос обратно.

Во время двух последних преобразований точка О" переходит сначала в О', потом в О.

Прикрепленное изображение

Результирующщие формулы записываются так (применяем матрицу поворота):

Ox = a1*cos(T) - 0*sin(T) + Вx
Oy = a1*sin(T) - 0*cos(T) + Вy

Средние слагаемые равны нулю. Остальные дадут нам координаты основания высоты.
Теперь осталось узнать угол Т. Его можно узнать из наклона прямой ВС. Например, так:

Т = ArcSin((Cy-By)/a)

Все понятно?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Глюк   Высоты треугольника   23.04.2007 1:03
volvo   Потому, что нельзя сравнивать вещественные числа н…   23.04.2007 1:08
Глюк   Потому, что нельзя сравнивать вещественные числа …   23.04.2007 2:30
Lapp   может что-то не так в самом тексте? Он иногда прав…   23.04.2007 12:34
Глюк   Во-первых, этот метод сам по себе неверный (в э…   23.04.2007 13:14
Lapp   а каким тогда способом можно найти точку,куда буд…   23.04.2007 13:43
Глюк   Ну, например, так: Высота из угла А делит противо…   23.04.2007 22:46
Lapp   как можно отложить отрезок,зная только его длину …   24.04.2007 5:26
Глюк   Все понятно? вообще-то не все... :unsure: B…   24.04.2007 23:29
Lapp   BC=a -это отрезок,на котором лежит высота треугол…   25.04.2007 0:58
Глюк   Проекция всегда меньше длины самого отрезка. …   25.04.2007 2:35
Глюк   Спасибо,сейчас работает,но он не правильно высоту …   23.04.2007 2:05
Глюк   :unsure: :unsure: подскажите,пожалуйста   24.04.2007 1:26
Глюк   у меня все-равно не так рисует...высота короткая п…   25.04.2007 4:20
Lapp   у меня все-равно не так рисует...высота короткая …   25.04.2007 10:40
Глюк   Lapp Ура. :) Всё наконец получилось! Спасибо …   25.04.2007 22:13
Глюк   Ещё я этот же способ применил и для рисования бисс…   26.04.2007 0:29
Lapp   Ещё я этот же способ применил и для рисования бис…   26.04.2007 1:01
Глюк   Lapp Ок. Спасибо! Попробуем :)   26.04.2007 17:32


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.04.2024 9:24
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name