У меня есть координаты точки pos = (x, y), и мне нужно проверить, является ли она частью прямой, проходящей через две точки p1 = (x1, y1), p2 = (x2, y2). Формула, которую я использую, Y-y1 = ((x-x1)/(x2 - x1)) * (y2-y1), а код:
if pos[1] - p1[1] - 10 <= ((pos[0] - p1[0]) / (p2[0] - p1[0])) * (p2[1] - p1[1]) <= pos[1] - p1[1] + 10:
return True
Пока я тестировал его, я заметил, что прямая линия наклона противоположна. image
Я получил это, проверив каждую точку холста (используя tkinter):
p1 = (313, 215)
p2 = (92, 44)
for x in range(0, 400):
for y in range(0, 300):
if y - p1[1] - 5 <= ((x - p1[0]) / (p2[0] - p1[0])) * (p2[1] - p1[1]) <= y - p1[1] + 5:
canvas.create_oval(x, y, x, y)
Самая большая из них-это линия, которая представлена приведенным выше уравнением, нарисованная от руки-это то, что я хочу.
Я пытался также протестировать его на geogebra, но там все работает properly...what я missimg?
Источник
Matteo Secco
3 ответа
Ваша математика, кажется, верна, поскольку проблема заключается в интерпретации.
Во-первых, вы могли бы немного упростить математику:
x1,y1 = p1
x2,y2 = p2
m = (y2-y1)/(x2-x1)
def f(x): return y1 + m*(x-x1)
def test(x,y,tol = 10):
return abs(y-f(x)) <= tol
А потом просто используйте test(x,y) или test(*pol) .
Проблема в том, что в координатах холста увеличение y фактически перемещает вас вниз по холсту. В вашем примере данных линия нарисована правильно в том смысле, что отрезок линии, соединяющий точки холста (313, 215) и (92,44) , является убывающей линией.
Возможно, вы хотите построить точки как (x,300-y) , а не (x,y) .
John Coleman
сравните наклон любых соседних точек, имеющих одинаковый наклон. это может быть достигнуто путем сравнения наклона каждой пары последовательных точек
если есть три точки (x1, y1)(x2, y2)(x3,y3)
(y2-y1) (x3-x2) = (y3-y2) (x2-x1)
продолжайте по всем пунктам до завершения
1.
а)
х²/(х²-у²) * (х-у)/х = х²/(х-у)(х+у) * (х-у)/х = х/(х+у),
б)
а/(3а+3в) : а²/(а²-в²) = а/(3*(а+в)) : а²/(а-в)(а+в) =
= а/(3*(а+в)) * (а-в)(а+в)/а² = (а-в)/3а,
в)
(-2с³/у)⁵ = -32с¹⁵/у⁵
г)
х/у² * 4ху = 4х²/у
2.
( у/(у-х) - (у-х)/у ) * (у-х)/х =
= ( у² - (у-х)²) / (у-х)у ) * (у-х)/х =
= ( у²-у²+2ху-х² ) / (у-х)у ) * (у-х)/х =
= х(2у-х) / (у-х)у ) * (у-х)/х = (2у-х) / у,
3.
(2х-4)/(х²+12х+36) : (8х-16)/(х²-36) =
= 2*(х-2)/(х+6)² : 8*(х-2)/(х-6)(х+6) =
= 2*(х-2)/(х+6)² : (х-6)(х+6)/8*(х-2) =
= (х-6) / 2*(х+6),
при х = 1,5:
(1,5-6) / 2*(1,5+6) = -4,5 / (2*7,5) = -4,5 / 15 = -3/10 (или -0,3)
4.
( а-8 + 32а/(а-8) ) * ( 8+а - 32а/(8+а) ) =
= [ ( (а-8)²+32а )/(а - 8) ] * [ ( (8+а)²-32а)/(8+а) ] =
= (а²-16а+64+32а)/(а-8) * (64+16а+а²-32а)/(8+а) =
= (а²+16а+64)/(а-8) * (а²-16а+64)/(8+а) =
= (а+8)²/(а-8) * (а-8)²/(8+а) =
= (а + 8)(а - 8) = а² - 64
рукописный вариант:
⇅⇅⇅⇅