![]() |
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 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо,сейчас работает,но он не правильно высоту рисует...Почему не пойму,ведь правильные же условия?Опять где-то ошибочка,што ли?
|
Глюк |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
|
Lapp |
![]()
Сообщение
#5
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
может что-то не так в самом тексте? Он иногда правильно высоту рисует,а иногда - нет...Он что-то не учитывает? Глюк, я попытался разобраться с твоим текстом, и кажется, мне это удалось..Ты выбрал крайне странный способ рисования. Ты считаешь высоту как удвоенную площадь (по формуле Герона) делить на сторону. А дальше ты делаешь очень странную вещь.. Ты проходишь циклом по прямоугольнику, натянотому на сторону, и берешь в нем последнюю точку, где выполняется (приблизительное) равенство h=l , где l - это расстояние от вершины до сканируемой точки прямоугольника. Метод - хоть сейчас в кунсткамеру.. ![]() Во-первых, этот метод сам по себе неверный (в этом множестве есть нужная точка, но она не последняя). Во-вторых, подумай, что будет, если, например, k1>k3 (то есть точка А лежит правее С) ? Или, скажем, если высота проходит вне треугольника? Мой совет: рассчитай точку основания высоты по-человечески и не городи огород в чистом поле.. Не нужны тут циклы - ни двойные, ни одинарные.. ![]() PS на будущее, когда задаешь такой вопрос, объясняй в общих чертах свой алгоритм. Продраться через твой причудливый код было непросто. Если ты изложишь алгоритм (как я сделал), то вероятность, скорость и правильность ответа тебе значительно повысятся. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Глюк |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
Во-первых, этот метод сам по себе неверный (в этом множестве есть нужная точка, но она не последняя). Во-вторых, подумай, что будет, если, например, k1>k3 (то есть точка А лежит правее С) ? Или, скажем, если высота проходит вне треугольника? Мой совет: рассчитай точку основания высоты по-человечески и не городи огород в чистом поле.. Не нужны тут циклы - ни двойные, ни одинарные.. ![]() а каким тогда способом можно найти точку,куда будет опущена высота?Я много чего просмотрел, ничего нормального не нашел?Может подскажете? |
Lapp |
![]()
Сообщение
#7
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
а каким тогда способом можно найти точку,куда будет опущена высота?Я много чего просмотрел, ничего нормального не нашел Ну, например, так: Высота из угла А делит противоположную сторону (a) на две части: а1 (при С) и а2 (при В). По теореме Пифагора имеем: a1^2 + h^2 = b^2 Отсюда находим а1. После этого остается некоторая неопределенность, в какую сторону от С откладывать этот кусок. Для проверки этого можно посчитать а2 (аналогично). Дальше нужно сделать примерно следующее.. Если a1+a2 = a - откладываем внутрь треугольника. Если a1+a2 > a , то - если a1>a2 , то внутрь; - в противном случае - наружу. Проверь логику, я не совсем уверен.. Добавлено через 12 мин. Вот, нарисовал картинки.. ![]() ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Глюк |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ну, например, так: Высота из угла А делит противоположную сторону (a) на две части: а1 (при С) и а2 (при В). По теореме Пифагора имеем: a1^2 + h^2 = b^2 Отсюда находим а1. После этого остается некоторая неопределенность, в какую сторону от С откладывать этот кусок. Для проверки этого можно посчитать а2 (аналогично). Дальше нужно сделать примерно следующее.. Если a1+a2 = a - откладываем внутрь треугольника. Если a1+a2 > a , то - если a1>a2 , то внутрь; - в противном случае - наружу. Проверь логику, я не совсем уверен.. спасибо.Но, а как можно отложить отрезок,зная только его длину и незная его координат? ![]() опять-таки меня тянет на цикл и поиск координат наабу?Но вы говорите,что их не рекомендовано использовать в этом случае?Других предположений у меня нет... ![]() |
Глюк |
![]()
Сообщение
#9
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
![]() ![]() подскажите,пожалуйста |
Lapp |
![]()
Сообщение
#10
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 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) Все понятно? -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Глюк |
![]()
Сообщение
#11
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
|
Lapp |
![]()
Сообщение
#12
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
BC=a -это отрезок,на котором лежит высота треугольника,да...Вот,...и когда находим угол Т, arcsin получается больше 1? И как тогда? Этого не может случиться. Т = ArcSin((Cy-By)/a) Длина ВС равна а. А Сy-By - это проекция его длины на ось Y. Проекция всегда меньше длины самого отрезка. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Глюк |
![]()
Сообщение
#13
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
|
Глюк |
![]()
Сообщение
#14
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
у меня все-равно не так рисует...высота короткая получается и она смещена.
И каким образом лучше задавать координаты 2-ой точки отрезка,на которой лежит высота? procedure TForm1.Button3Click(Sender: TObject); |
Lapp |
![]()
Сообщение
#15
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
у меня все-равно не так рисует...высота короткая получается и она смещена. И каким образом лучше задавать координаты 2-ой точки отрезка,на которой лежит высота? О некотором мне не удалось догадаться (не понимаю, почему бы не сказать самому, что есть что?) - что такое w1 и w2? w_k1z1:= sqrt(sqr(k1-w1)+sqr(z1-w2)); Сответствеено, я не понимаю, как ты вычисляешь Т: T:=arcsin((w2-z2)/w_k1z1); Правда, я сам немного ошибся в расчете Т (точнее, сделал расчет не до конца - только для углов меньше Пи/2 по модулю). Вот полная версия: T:=arcsin((Cy-By)/a); Идем дальше.. а1 и а2 ты преепутал местами. Должно быть так: a1:=sqrt(sqr(c )-sqr(ha)); А дальше логику можно сильно упростить: if (a1+a2-a>1e-5)and(a1<a2) then a1:=-a1; И дальше все делать по общим формулам (пишу свои, потому что у тебя вообще полный бардак; сравни - увидишь) Mx := round(a1*cos(T))+Bx; Здесь точка М (Mx,My) - это вместо точки О на рисунке. Что такое Ах и т.п. - надеюсь, разберешься.. Я твоих k1 и z3 не понимаю.. Это надо же себя так путать самого.. Вот, приблизительно так. Давай, делай и говори, что получается.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Глюк |
![]()
Сообщение
#16
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
Lapp
Ура. ![]() Я просто сам запутался с этими обозначениями! |
Глюк |
![]()
Сообщение
#17
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ещё я этот же способ применил и для рисования биссектрис-ВСЁ получается!!!
![]() Спасиб ещё раз! |
Lapp |
![]()
Сообщение
#18
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Ещё я этот же способ применил и для рисования биссектрис-ВСЁ получается!!! ![]() Приятно слышать! ![]() Не знаю, нужно ли тебе, но у меня совет по дальнейшему улучшению и развитию.. Я бы сделал что-то типа такого.. Делаешь примерно такую структуру:
Для задания треугольника необходимы только поля вершин. После этого все вычисления проводишь в цикле по вершинам и т.п. Вывод графики тоже в цикле.. ![]() Успехов! -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Глюк |
![]()
Сообщение
#19
|
Новичок ![]() Группа: Пользователи Сообщений: 34 Пол: Мужской Репутация: ![]() ![]() ![]() |
Lapp
Ок. Спасибо! Попробуем ![]() |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 7:07 |