Показать сообщение отдельно
Старый 17.02.2013, 21:41   #1
A_Z
Оператор ЭВМ
 
Аватар для A_Z
 
Регистрация: 15.11.2010
Сообщений: 43
Написано 19 полезных сообщений
(для 45 пользователей)
Новый 3d редактор RiFLe - вопрос к математикам

Здраствуйте уважаемые форумчане. Запиливаю небольшой 3d редактор RiFLe(во вложении версия на текущий момент, скриншот) для удобства создания low-poly моделей типа рельефных надписей, стен с оконными и дверными проёмами, хотя можно сделать модель и посложнее.

Сделал автоматическое рисование треугольников(триангуляция Делоне), но вот никак не могу найти решение для простой на первый взгляд задачи - найти центр описанной около треугольника окружности в координатной форме.

СУТЬ ПРОБЛЕМЫ
В триангуляции использован исходник для нахождения координат центра описанной окружности, который, как оказалось, с ошибкой. Из-за этого треугольники не рисуются в случае, подобном примеру Example_with_Error.

Есть статья на википедии http://ru.wikipedia.org/wiki/Описанная_окружность

но там в векторной форме и непонятно как использовать эти два числа в скобке через запятую (перемножить или что?)


Буду очень рад, если кот-нибудь подскажет как эти уравнения расписать подробно в координатной форме( чтоб запрогать их)

Вот старый исходник, который счас в редакторе.

Function InCircle(xp#, yp#, x1#, y1#, x2#, y2#, x3#, y3#, xc#, yc#, r#)
		Local eps#
		Local m1#
		Local m2#
		Local mx1#
		Local mx2#
		Local my1#
		Local my2#
		Local dx#
		Local dy#
		Local rsqr#
		Local drsqr#
		eps# = 0.000001	
		Result = False
		If Abs(y1 - y2) < eps And Abs(y2 - y3) < eps Then
		    Return True
		EndIf
		If Abs(y2# - y1#) < eps# Then
		    m2# = -(x3# - x2#) / (y3# - y2#)
		    mx2# = (x2# + x3#) / 2
		    my2# = (y2# + y3#) / 2
		    xc# = (x2# + x1#) / 2
		    yc# = m2# * (xc# - mx2#) + my2#
		ElseIf Abs(y3# - y2#) < eps# Then
		    m1# = -(x2# - x1#) / (y2# - y1#)
		    mx1# = (x1# + x2#) / 2
		    my1# = (y1# + y2#) / 2
		    xc# = (x3# + x2#) / 2
		    yc# = m1# * (xc# - mx1#) + my1#
		Else
		    m1# = -(x2# - x1#) / (y2# - y1#)
		    m2# = -(x3# - x2#) / (y3# - y2#)
		    mx1# = (x1# + x2#) / 2
		    mx2# = (x2# + x3#) / 2
		    my1# = (y1# + y2#) / 2
		    my2# = (y2 + y3#) / 2
		    xc# = (m1# * mx1# - m2# * mx2# + my2# - my1#) / (m1# - m2#)
		    yc# = m1# * (xc# - mx1#) + my1#
		EndIf
		      
		dx# = x2# - xc#
		dy# = y2# - yc#
		rsqr#= dx# * dx + dy * dy#
		;r = Sqr(rsqr)
		dx# = xp# - xc#
		dy# = yp# - yc#
		drsqr = dx# * dx# + dy#* dy#
		If drsqr# <= rsqr# Then Result = True
		Return Result
End Function
Спасибо
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 1367
Размер:	114.5 Кб
ID:	18807  
Вложения
Тип файла: zip RiFLe.zip (1.78 Мб, 740 просмотров)
__________________
Человек с оружием.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Program23 (18.02.2013)