mrcnn
31-05-2008, 17:08
В декартовой системе координат, образованной окном Windows
Дано: точка 1 (x1, y1) точка 2 (x2, y2) точка 3 (x3, y3) ... точка n (xn, yn)
x1=xn
y1=yn
Замкнутый многоугольник
Найти: все углы многоугольника
Первый угол образован прямыми (x1, y1) - (x2, y2) и (x2, y2) - (x3, y3) .......
N угол образован прямыми (x(n-1), y(n-1)) - (xn, yn) и (xn, yn) - (x1, y1)
Решение:
Длину вектора найти очень просто.
Длина первого вектора
len1 = Math.Sqrt(Math.Abs((x2-x1) * (x2-x1)) + Math.Abs((y2-y1) * l(y2-y1)))
Длина второго вектора
len2 = Math.Sqrt(Math.Abs((x3-x2) * (x3-x2)) + Math.Abs((y3-y2) * l(y3-y2)))
Угол получаем по формуле
(скалярное произведение первого вектора на второй вектор ) / длина первого вектора * длину второго вектора
Скалярное произведение первого вектора на второй
это (x2-x1)*(x3-x2) + (y3-y2)*(y2-y1)
Косинус угла это ( (x2-x1)*(x3-x2) + (y3-y2)*(y2-y1)) / ( len1*len2)
Acos(cos)*180 получаем угол...
Что я не учел? В чем ошибка в рассуждениях и в коде?
Координаты точек хранятся в двух массивах.
XM - координаты x
YM - координата y
tm - длина массивов
Длина массивов одинакова, счетчик совпадает
Код
If tm > 1 Then
For cn = 0 To tm
ReDim Preserve ug(sug)
q1 = cn + 1
If q1 > tm Then
q1 = Math.Abs(tm - Math.Abs(tm - q1) - 1)
End If
q2 = cn + 2
If q2 > tm Then
q2 = Math.Abs(tm - Math.Abs(tm - q2) - 1)
End If
lx = Math.Abs(XM(q1) - XM(cn))
ly = Math.Abs(YM(q1) - YM(cn))
mx = Math.Abs(XM(q2) - XM(q1))
my = Math.Abs(YM(q2) - YM(q1))
z1 = Math.Sqrt(Math.Abs(lx * lx) + Math.Abs(ly * ly))
z2 = Math.Sqrt(Math.Abs(mx * mx) + Math.Abs(my * my))
ug(sug) = (Math.Acos((lx * mx + ly * my) / (z1 * z2))) * 180
MsgBox(CStr(ug(sug)))
sug = sug + 1
Next
для прямоугольного треугольника выдача: 115, 164, 280
280 вполне логичное значение т.к 360-280=90
115 и 164 как получены не понимаю значит где-то ошибка
Где я ошибся?
Дано: точка 1 (x1, y1) точка 2 (x2, y2) точка 3 (x3, y3) ... точка n (xn, yn)
x1=xn
y1=yn
Замкнутый многоугольник
Найти: все углы многоугольника
Первый угол образован прямыми (x1, y1) - (x2, y2) и (x2, y2) - (x3, y3) .......
N угол образован прямыми (x(n-1), y(n-1)) - (xn, yn) и (xn, yn) - (x1, y1)
Решение:
Длину вектора найти очень просто.
Длина первого вектора
len1 = Math.Sqrt(Math.Abs((x2-x1) * (x2-x1)) + Math.Abs((y2-y1) * l(y2-y1)))
Длина второго вектора
len2 = Math.Sqrt(Math.Abs((x3-x2) * (x3-x2)) + Math.Abs((y3-y2) * l(y3-y2)))
Угол получаем по формуле
(скалярное произведение первого вектора на второй вектор ) / длина первого вектора * длину второго вектора
Скалярное произведение первого вектора на второй
это (x2-x1)*(x3-x2) + (y3-y2)*(y2-y1)
Косинус угла это ( (x2-x1)*(x3-x2) + (y3-y2)*(y2-y1)) / ( len1*len2)
Acos(cos)*180 получаем угол...
Что я не учел? В чем ошибка в рассуждениях и в коде?
Координаты точек хранятся в двух массивах.
XM - координаты x
YM - координата y
tm - длина массивов
Длина массивов одинакова, счетчик совпадает
Код
If tm > 1 Then
For cn = 0 To tm
ReDim Preserve ug(sug)
q1 = cn + 1
If q1 > tm Then
q1 = Math.Abs(tm - Math.Abs(tm - q1) - 1)
End If
q2 = cn + 2
If q2 > tm Then
q2 = Math.Abs(tm - Math.Abs(tm - q2) - 1)
End If
lx = Math.Abs(XM(q1) - XM(cn))
ly = Math.Abs(YM(q1) - YM(cn))
mx = Math.Abs(XM(q2) - XM(q1))
my = Math.Abs(YM(q2) - YM(q1))
z1 = Math.Sqrt(Math.Abs(lx * lx) + Math.Abs(ly * ly))
z2 = Math.Sqrt(Math.Abs(mx * mx) + Math.Abs(my * my))
ug(sug) = (Math.Acos((lx * mx + ly * my) / (z1 * z2))) * 180
MsgBox(CStr(ug(sug)))
sug = sug + 1
Next
для прямоугольного треугольника выдача: 115, 164, 280
280 вполне логичное значение т.к 360-280=90
115 и 164 как получены не понимаю значит где-то ошибка
Где я ошибся?