Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Узнать точку пересечения срединных перпендикуля... Добавлено: 15.02.03 14:36  

Автор вопроса:  Страшный Сон

Надо узнать точку пересечения срединных перпендикуляров в трёугольнике, проще говоря, просто узнать точку пересечения двух отрезков! Кто-нить в этом разбирается?

 

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 Silent Bob



Вопросов: 36
Ответов: 65
 Web-сайт: podelyakin.narod.ru
 Профиль | | #1
Добавлено: 15.02.03 22:09

смайлики просто улётные. Можно приравнять ур-я прямых. Подробно онахождении ур-ий по координатам можно прочитать в руководстве для поступающих в МГУ.

Ответить

Номер ответа: 2
Автор ответа:
 AlexSid



Вопросов: 4
Ответов: 27
 Профиль | | #2 Добавлено: 16.02.03 02:49

Составляешь систему уравнений прямых. Решаешь... По методу Крамера, например! Если есть решение, значит ты получил то, что надо. Нет - значит параллельны... (хотя, если это серед. перпендикуляры, то такой случай исключается)

Ответить

Номер ответа: 3
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #3 Добавлено: 16.02.03 09:33

Расскажите тада что-нибудь об этих уравнениях, или ссыллочку дайте.

 

> хотя, если это серед. перпендикуляры, то такой случай исключается

Я так не думаю. Если у треугольника один из углов равен 180 градусам, а длина самой длинной стороны равна сумме длин двух других, то ср. перпендикуляры будут параллельны. В таком случае треугольник будет выглядеть как линия, а описать окружность вокруг него будет невозможно. :-)))

Ответить

Номер ответа: 4
Автор ответа:
 vig11



ICQ: 213777061 

Вопросов: 21
Ответов: 159
 Профиль | | #4 Добавлено: 16.02.03 10:01
У треугольника один угол не может быть равным 180 градусам. 180 градусов это сумма всех углов треугольника.

Ответить

Номер ответа: 5
Автор ответа:
 AlexSid



Вопросов: 4
Ответов: 27
 Профиль | | #5 Добавлено: 16.02.03 12:28

"Если у треугольника один из углов равен 180 градусам"...

Я не рассматриваю вырожденного случая!

Глянь на http://algolist.manual.ru/maths/geom/intersect/lineline2d.php...

И вообще на algolist.ru, может найдешь чего.

 

Ответить

Номер ответа: 6
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #6 Добавлено: 16.02.03 13:02

> У треугольника один угол не может быть равным 180 градусам. 180 градусов это сумма всех углов треугольника.

Ну вот так и есть - один угол равен 180 градусам, два других - нулю. Треугольник такой.  

Ответить

Номер ответа: 7
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #7 Добавлено: 16.02.03 13:48

Уау, получилось!  Нашло оно этот проклятый центр описанной окружности!  Правда, пришлось немного поломать голову  над этим уравнением...

Ответить

Номер ответа: 8
Автор ответа:
 Bob



Вопросов: 0
Ответов: 2
 Профиль | | #8 Добавлено: 28.02.03 13:49

Привет!

Пресечение прямых получишь используя функцию peresec

Немножко нелепо выглядит (без особых раздумий перенёс со старых своих исходников на С), но работать должна, проверь.

Я проверял корректность функции рисуя на форме пересекающиеся линии.

Global Const HORIZ = 0
Global Const VERT = 1
Global Const ANGLL = 2
Global Const ORTO = 3
Global Const ERRORH = 50
Global Const OFF = -1
Global Const OMM = 1
Public Function Parline(ByRef a As Variant, ByRef b As Variant, x0 As Variant, _
y0 As Variant, x1 As Variant, y1 As Variant) As Integer
Dim dx, dy, tmp As Double
Dim PI As Double
PI = 4 * Atn(1)
tmp = Sqr((x1 - x0) ^ 2 + (y1 - y0) ^ 2)
If tmp = 0# Then: Parline = ERRORH: Exit Function
dx = Abs(x1 - x0)
dy = Abs(y1 - y0)
If dy < 0.25 Then: a = 0#: b = y0: Parline = HORIZ: Exit Function
If dx < 0.25 Then: a = 1E+15: b = x0: Parline = VERT: Exit Function
If dx > dy Then
    dx = dx / tmp
    dx = Atn(-dx / Sqr(-dx * dx + 1)) + 2 * Atn(1)
    If Abs(dx) < 0.0001 Then
    a = 0#
    b = y0
    Parline = HORIZ
    Exit Function
    Else
    If Abs(dx - PI / 2) < 0.0001 Then a = 1E+15: b = x0: Parline = VERT: Exit Function
    End If
Else
    dy = dy / tmp
    dx = Atn(dy / Sqr(-dy * dy + 1))
    If Abs(dx) < 0.0001 Then
    a = 0#: b = y0: Parline = HORIZ: Exit Function
    Else
    If Abs(dx - PI / 2) < 0.0001 Then a = 1E+15: b = x0: Parline = VERT: Exit Function
    End If
End If
a = (y1 - y0) / (x1 - x0)
b = y0 - a * x0
Parline = ANGLL
End Function


Public Function Peresec(ByRef xp As Variant, ByRef yp As Variant, x1 As Variant, _
y1 As Variant, x2 As Variant, y2 As Variant, x3 As Variant, y3 As Variant, _
x4 As Variant, y4 As Variant) As Integer


Dim to1, to2 As Integer
Dim a1, a2, b1, b2 As Single
xp = -1
yp = -1
to1 = Parline(a1, b1, x1, y1, x2, y2)
to2 = Parline(a2, b2, x3, y3, x4, y4)
If to1 = VERT Then
  If Sqr(x1 ^ 2 + y1 ^ 2) < Sqr(x2 ^ 2 + y2 ^ 2) Then
  x2 = x1
  Else
  x1 = x2
  End If
End If
If to2 = VERT Then
  If Sqr(x3 ^ 2 + y3 ^ 2) < Sqr(x4 ^ 2 + y4 ^ 2) Then
  x4 = x3
  Else
  x3 = x4
  End If
End If
If to2 = to1 And (to2 = VERT Or to2 = HORIZ) Then
   If Abs(b1 - b2) > 0.0001 Then: GoTo OFF
   If to1 = HORIZ Then
     If x1 > x2 Then: Swap x1, x2
     If x3 > x4 Then: Swap x3, x4
     yp = b1
     xp = x4
     If Abs(x2 - x1) > Abs(x4 - x3) Then
         If x1 = x3 And x2 > x4 Then: GoTo OM
     End If
     xp = x2
     If Abs(x2 - x1) < Abs(x4 - x3) Then
         If x1 = x3 And x2 < x4 Then: GoTo OM
     End If
     xp = x1
     If x1 = x4 Then: GoTo OM
     xp = x2
     If x2 = x3 Then: GoTo OM
     If x4 = x2 Then
     xp = x1
         If Abs(x2 - x1) < Abs(x4 - x3) Then GoTo OM
         xp = x3
         If Abs(x2 - x1) > Abs(x4 - x3) Then GoTo OM
     End If
     If (x2 < x3) Or (x1 > x4) Then GoTo OFF
     Peresec = ERRORH
     Exit Function
   End If
   If y1 > y2 Then: Swap y1, y2
   If y3 > y4 Then: Swap y3, y4
   If (y2 - y1) > (y4 - y3) Then
   xp = b1
      If (y1 = y3) And (y2 > y4) Then: yp = y4: GoTo OM
      'If y2 = y3 Then: yp = y2: GoTo Om
      'If y1 = y4 Then: yp = y1: GoTo Om
      If y2 = y4 Then
          If Abs(y2 - y1) < Abs(y4 - y3) Then: yp = y1: GoTo OM
          If Abs(y2 - y1) > Abs(y4 - y3) Then: yp = y3: GoTo OM
      End If
   End If
   If y2 - y1 < y4 - y3 Then
      If (y1 = y3) And (y2 < y4) Then: xp = b1: yp = y2: GoTo OM
   End If
End If
If (to1 = VERT) And (to2 = HORIZ) Then
xp = b1
yp = b2
   If (((b2 >= y1 And b2 <= y2) Or (b2 <= y1 And b2 >= y2)) _
   And ((b1 >= x3 And b1 <= x4) Or (b1 <= x3 And b1 >= x4))) Then
   GoTo OM
   Else
   GoTo OFF
   End If
End If
If (to2 = VERT) And (to1 = HORIZ) Then
xp = b2
yp = b1
     If (((b2 > x1 And b2 < x2) Or (b2 < x1 And b2 > x2)) And _
       ((b1 >= y3 And b1 <= y4) Or (b1 <= y3 And b1 >= y4))) Then
   GoTo OM
   Else
   GoTo OFF
   End If
End If
xp = x1
yp = y1
If (Abs(x1 - x3) < 0.01 And Abs(y1 - y3) < 0.01 And a1 <> a2) Then GoTo OM
If (Abs(x1 - x4) < 0.01 And Abs(y1 - y4) < 0.01 And a1 <> a2) Then GoTo OM
xp = x2
yp = y2
  If (Abs(x2 - x4) < 0.01 And Abs(y2 - y4) < 0.01 And a1 <> a2) Then GoTo OM
  If (Abs(x2 - x3) < 0.01 And Abs(y2 - y3) < 0.01 And a1 <> a2) Then GoTo OM
  If (x1 > x2) Then: Swap x1, x2
  If (y1 > y2) Then: Swap y1, y2
  If (x3 > x4) Then: Swap x3, x4
  If (y3 > y4) Then: Swap y3, y4
If (to1 = ANGLL Or to2 = ANGLL) Then
    If (Abs(a1 - a2) < 0.0001) Then
       If (Abs(b2 - b1) < 0.0001) Then
          If (((x1 > x3) And (x2 < x3)) Or ((x1 > x4) And (x2 < x4))) Then
          GoTo OM
          Else
          GoTo OFF
          End If
    &nb

Ответить

Номер ответа: 9
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #9 Добавлено: 28.02.03 14:26

Ну ты блин закрутил...  Никакой процессор не возьмётся выполнять стоко всякого д..... 100 раз в секунду!

Ответить

Номер ответа: 10
Автор ответа:
 Bob



Вопросов: 0
Ответов: 2
 Профиль | | #10 Добавлено: 03.03.03 08:52

Это работает.

Не нравится сделай лучше. Удачи!

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам