![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Глюк |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
Здравствуйте. Здесь часть программки,которая рисует треугольник и его высоты. Проблема в одном: там строчка выделена. Почему,когда 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); Сообщение отредактировано: Глюк - 22.04.2007 21:07 |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Потому, что нельзя сравнивать вещественные числа напрямую... Сравнивай с погрешностью:
If abs(g1 - L) < 0.001 Then ... Сообщение отредактировано: volvo - 22.04.2007 21:08 |
Глюк |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
|
Lapp |
![]()
Сообщение
#4
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
может что-то не так в самом тексте? Он иногда правильно высоту рисует,а иногда - нет...Он что-то не учитывает? Глюк, я попытался разобраться с твоим текстом, и кажется, мне это удалось..Ты выбрал крайне странный способ рисования. Ты считаешь высоту как удвоенную площадь (по формуле Герона) делить на сторону. А дальше ты делаешь очень странную вещь.. Ты проходишь циклом по прямоугольнику, натянотому на сторону, и берешь в нем последнюю точку, где выполняется (приблизительное) равенство h=l , где l - это расстояние от вершины до сканируемой точки прямоугольника. Метод - хоть сейчас в кунсткамеру.. ![]() Во-первых, этот метод сам по себе неверный (в этом множестве есть нужная точка, но она не последняя). Во-вторых, подумай, что будет, если, например, k1>k3 (то есть точка А лежит правее С) ? Или, скажем, если высота проходит вне треугольника? Мой совет: рассчитай точку основания высоты по-человечески и не городи огород в чистом поле.. Не нужны тут циклы - ни двойные, ни одинарные.. ![]() PS на будущее, когда задаешь такой вопрос, объясняй в общих чертах свой алгоритм. Продраться через твой причудливый код было непросто. Если ты изложишь алгоритм (как я сделал), то вероятность, скорость и правильность ответа тебе значительно повысятся. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Глюк |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
Во-первых, этот метод сам по себе неверный (в этом множестве есть нужная точка, но она не последняя). Во-вторых, подумай, что будет, если, например, k1>k3 (то есть точка А лежит правее С) ? Или, скажем, если высота проходит вне треугольника? Мой совет: рассчитай точку основания высоты по-человечески и не городи огород в чистом поле.. Не нужны тут циклы - ни двойные, ни одинарные.. ![]() а каким тогда способом можно найти точку,куда будет опущена высота?Я много чего просмотрел, ничего нормального не нашел?Может подскажете? |
Lapp |
![]()
Сообщение
#6
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
а каким тогда способом можно найти точку,куда будет опущена высота?Я много чего просмотрел, ничего нормального не нашел Ну, например, так: Высота из угла А делит противоположную сторону (a) на две части: а1 (при С) и а2 (при В). По теореме Пифагора имеем: a1^2 + h^2 = b^2 Отсюда находим а1. После этого остается некоторая неопределенность, в какую сторону от С откладывать этот кусок. Для проверки этого можно посчитать а2 (аналогично). Дальше нужно сделать примерно следующее.. Если a1+a2 = a - откладываем внутрь треугольника. Если a1+a2 > a , то - если a1>a2 , то внутрь; - в противном случае - наружу. Проверь логику, я не совсем уверен.. Добавлено через 12 мин. Вот, нарисовал картинки.. ![]() ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Глюк |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ну, например, так: Высота из угла А делит противоположную сторону (a) на две части: а1 (при С) и а2 (при В). По теореме Пифагора имеем: a1^2 + h^2 = b^2 Отсюда находим а1. После этого остается некоторая неопределенность, в какую сторону от С откладывать этот кусок. Для проверки этого можно посчитать а2 (аналогично). Дальше нужно сделать примерно следующее.. Если a1+a2 = a - откладываем внутрь треугольника. Если a1+a2 > a , то - если a1>a2 , то внутрь; - в противном случае - наружу. Проверь логику, я не совсем уверен.. спасибо.Но, а как можно отложить отрезок,зная только его длину и незная его координат? ![]() опять-таки меня тянет на цикл и поиск координат наабу?Но вы говорите,что их не рекомендовано использовать в этом случае?Других предположений у меня нет... ![]() |
Lapp |
![]()
Сообщение
#8
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
как можно отложить отрезок,зная только его длину и незная его координат? Рисуй на листе бумаги параллельно с моими пояснениями. У нас есть система координат - оси Х и У. Далее, у тебя есть две точки: 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) Все понятно? -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Глюк |
![]()
Сообщение
#9
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
|
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 7:13 |