Определить: лежит точка в треугольнике - QBasic

Узнай цену своей работы

Формулировка задачи:

Мне уже два или три раза попадались задачи, где прямо или косвенно требовалось определить: лежит точка в треугольнике или нет. Ответы были половинчатыми и даже мой собственный ответ мне не понравился. И вот здесь, я решил раз и навсегда дать четкий ответ на этот вопрос. Итак нам задан треугольник с координатами вершин (x1;y1), (x2;y2), (x3;y3) и точка (x4;y4). Требуется определить положение точки относительно треугольника. Предположим, что точка лежит внутри треугольника. Соединим эту точку с любой вершиной треугольника. Тогда мы можем составить два уравнения прямой 1-я прямая проходит через вершину треугольника и заданную точку. 2-я прямая сторона, которую пересекает 1-я прямая. Вот их уравнения: (x - x1)/(x4 - x1) = (y - y1)/(y4 - y1) (x - x2)/(x3 - x2) = (y - y2)/(y3 - y2) Найдем точку пересечения этих прямых: (дополнительно введем обозначения) A = (y4 - y1)/(x4 - x1) B = (y3 - y2)/(x3 - x2) и далее имеем систему y = A(x - x1) + y1 y = B(x - x2) + y2 решая ее получим x = (A*x1 - B*x2 + y2 + y1)/(A - B) y = A(x - x1) + y1 (пусть C - вершина треугольника, D - точка, E - найденная нами точка пересечения) Теперь надо убедиться, что выполняется равенство: CD + DE = CE (!!!) И САМОЕ ГЛАВНОЕ: если вы думаете, что все уже сделано, то ошибаетесь Надо ВСЕ вычисления провторить для КАЖДОЙ ВЕРШИНЫ ! Я привожу вам кристально чистое и логически корректное решение Перед красотой этого кода вздрогнет сердце программиста (если он настоящий программист (от бога !!))
Листинг программы
  1. DEFSNG A-D, R, X-Y
  2. DEFINT E
  3. DECLARE SUB TRI (c1!, d1!, c2!, d2!, c3!, d3!, c4!, d4!, e%)
  4. CLS
  5. RANDOMIZE TIMER
  6. x1 = 10 * RND
  7. x2 = 10 * RND
  8. x3 = 10 * RND
  9. x4 = 10 * RND
  10. y1 = 10 * RND
  11. y2 = 10 * RND
  12. y3 = 10 * RND
  13. y4 = 10 * RND
  14. e = 0
  15. IF (x3 - x1) * (y2 - y1) = (y3 - y1) * (x2 - x1) THEN
  16. PRINT "Line"
  17. GOTO 100
  18. END IF
  19. CALL TRI(x1, y1, x2, y2, x3, y3, x4, y4, e)
  20. CALL TRI(x2, y2, x1, y1, x3, y3, x4, y4, e)
  21. CALL TRI(x3, y3, x2, y2, x1, y1, x4, y4, e)
  22. IF e = 3 THEN
  23. PRINT "Yes"
  24. ELSE
  25. PRINT "No"
  26. END IF
  27. PRINT USING "#.##### "; x1; x2; x3; x4
  28. PRINT USING "#.##### "; y1; y2; y3; y4
  29. 100
  30. END
  31. SUB TRI (c1, d1, c2, d2, c3, d3, c4, d4, e)
  32. a = (d4 - d1) / (c4 - c1)
  33. b = (d3 - d2) / (c3 - c2)
  34. c5 = (a * c1 - b * c2 + d2 - d1) / (a - b)
  35. d5 = a * (c5 - c1) + d1
  36. r1 = SQR((c4 - c1) ^ 2 + (d4 - d1) ^ 2)
  37. r2 = SQR((c4 - c5) ^ 2 + (d4 - d5) ^ 2)
  38. r = SQR((c1 - c5) ^ 2 + (d1 - d5) ^ 2)
  39. IF ABS(r1 + r2 - r) < .0001 THEN e = e + 1
  40. END SUB
P.S. Дарю вам этот код и Радость грядущего лета впридачу! P.P.S. как я рад, что кому-то помог

Решение задачи: «Определить: лежит точка в треугольнике»

textual
Листинг программы
  1. DECLARE FUNCTION s (x1, y1, x2, y2, x, y)
  2. INPUT "#1 - ", x1, y1
  3. INPUT "#2 - ", x2, y2
  4. INPUT "#3 - ", x3, y3
  5. INPUT "#4 - ", x4, y4
  6. side1=(s(x1, y1, x2, y2, x3, y3)=s(x1, y1, x2, y2, x4, y4))  'проверка на одностороннее положение (относительно
  7. side2=(s(x2, y2, x3, y3, x1, y1)=s(x2, y2, x3, y3, x4, y4))  'проверяемой стороны) данной точки и точек треугольника,
  8. side3=(s(x1, y1, x2, y2, x3, y3)=s(x1, y1, x2, y2, x4, y4))  'не лежащих на проверяемой стороне
  9. IF side1 AND side2 AND side3 THEN PRINT "in the triangle" ELSE PRINT "not in triangle" 'если все всё по одну сторону, то true
  10. END
  11.  
  12. FUNCTION s (x1, y1, x2, y2, x, y)
  13.     k=(y2-y1)/(x2-x1)    'вычисление линейного уравнения стороны
  14.     b=y1-k*x1
  15.     s=x*k+b<y            'выше ли точка относительно стороны
  16.     IF x2=x1 THEN s=x<x1 'если сторона вертикальна, то проверка: левее ли точка относительно стороны
  17. END FUNCTION

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы