![]() |
|
||||||||||
|
|||||
|
Но все-равно мне больше нравятся беспроигрышные варианты
![]() Рисуем один круг. соединяем соседние. Потом рисуем второй круг. Тоже соединяем соседние. А потом от внутреннего круга к внешнему ведем линии. Единственное что надо - это проследить чтоб одна точка внешнего круга не была связана с более чем одной точкой внутреннего. Но одна точка внутреннего может быть соединена с любым количеством внешнего. ![]() Добавлено через 3 минуты Кругов концентрических рисуйте хоть с десяток. Только требование - между собой соединять только соседние круги, и только изнутри наружу. Я ж надеюсь вы не будете пытаться их действительно рисовать кругами? ))Достаточно просто сделать двумерный массив spiders[<#круга>][<#паука>]; Добавлено через 10 минут И еще. Круги соединять надо последовательно. Чтобы не было такого что паук в первом ряду с номером 0, соединен с пауком во втором ряду с номером 5 А паук в первом ряду с номером 1, соединен с пауком во втором ряду с номером 2. Ибо эти две линии пересекутся... Ну а дальше я хз кажись просто взять и написать![]() |
|
|||||
|
Сегодня вечером подумаю что можно сделать.
С кругами все конечно идеально, но алгоритм сложноват получается. Я пол ночи бился чтоб проверку на пересечение придумать. Вот кстати код. Он проверяет пересечение 2 линий, но если они пересекаются своими концами, то считает что не пересекаются. Что мне и нужно было. Со множеством линий пока не тестировал. var xx:Array = new Array(5); var yy:Array = new Array(5); var Z; var Ca; var Cb; var Ua; var Ub; xx[1]=10; yy[1]=10; xx[2]=200; yy[2]=200; xx[3]=10; yy[3]=200; xx[4]=200; yy[4]=10; //Прорисовываем для наглядности graphics.clear(); graphics.lineStyle(5, 0); graphics.moveTo(xx[1], yy[1]); graphics.lineTo(xx[2], yy[2]); graphics.moveTo(xx[3], yy[3]); graphics.lineTo(xx[4], yy[4]); //********* Ca = (xx[4]-xx[3])*(yy[1]-yy[3]) - (yy[4]-yy[3])*(xx[1]-xx[3]); Cb = (xx[2]-xx[1])*(yy[1]-yy[3]) - (yy[2]-yy[1])*(xx[1]-xx[3]); Z = (yy[4]-yy[3])*(xx[2]-xx[1]) - (xx[4]-xx[3])*(yy[2]-yy[1]); if (Z != 0) { Ua = Ca/Z; Ub = Cb/Z; if ((Ua>0) && (Ua<1) && (Ub>0) && (Ub<1) ) { trace("Пересекается") } } |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 428
|
Немного модифицировал Ваш алгоритм, сделал пересечение нескольких линий, саму проверку пересечения оставил Вашу
var lines:Array = []; lines.push([[10,10],[50,50]]); //линия с начальными координатами и конечными lines.push([[60,60],[100,100]]); //линия с начальными координатами и конечными lines.push([[110,110],[140,140]]); //линия с начальными координатами и конечными lines.push([[150,30],[0,0]]); //линия с начальными координатами и конечными lines.push([[70,0],[70,100]]); //линия с начальными координатами и конечными //Прорисовываем для наглядности graphics.lineStyle(5, 0); for each(var line in lines) { graphics.moveTo(line[0][0], line[0][1]); graphics.lineTo(line[1][0], line[1][1]); } //проверка на пересечение for (line in lines) { for (var subline = line+1; subline < lines.length; subline++) { var Ca = (lines[subline][1][0]-lines[subline][0][0])*( lines[line][0][1]-lines[subline][0][1]) - (lines[subline][1][1]-lines[subline][0][1])*(lines[line][0][0]-lines[subline][0][0]); var Cb = (lines[line][1][0]-lines[line][0][0])*(lines[line][0][1]-lines[subline][0][1]) - (lines[line][1][0]-lines[line][0][1])*(lines[line][0][0]-lines[subline][0][0]); var Z = (lines[subline][1][1]-lines[subline][0][1])*(lines[line][1][0]-lines[line][0][0]) - (lines[subline][1][0]-lines[subline][0][0])*(lines[line][1][0]-lines[line][0][1]); if (Z != 0) { var Ua = Ca/Z; var Ub = Cb/Z; if ((Ua>0) && (Ua<1) && (Ub>0) && (Ub<1) ) { trace("Пересекается прямая ", lines[line], " с прямой ", lines[subline]); return;//если надо найтим все пересечения, return убираем } } } }
__________________
Скажи мне кто твой друг и я скажу тебе кто твой друг |
|
|||||
|
А я массив пауков составил)))) там в нужных местах рандома добавить осталось
![]() public class NewClass { private var spiders:Vector.<Vector.<Spider>> = new Vector.<Vector.<Spider>>(2, true); public function NewClass() { spiders[0] = new Vector.<Spider>(); for (var j:int = 0; j < 10; j++){ spiders[0].push(new Spider()); } spiders[1] = new Vector.<Spider>(); for (j = 0; j < 20; j++) { spiders[1].push(new Spider()); } drawLines(); } private function drawLines():void { //соединяем второй круг var i:int = 0; while (i < spiders[1].length) { spiders[1][i].connects.push(spiders[1][i+1]) } spiders[1][spiders[1].length - 1].connects.push(spiders[1][0]); //проводим линии от первого круга до второго i = 0; var j:int = 0; var count:int; var startNext:int = 0 // это наш минимальный индекс паука во втором ряду while (i < spiders[0].length) {//проходим по всем паукам первого круга spiders[0][i].connects.push(spiders[0][i+1]) var count = Math.round(Math.random() * (spiders[1][spiders[1].length - 1])) //устанавливаем максимальное количество соединений for (j = startNext ; j < startNext + count && j < spiders[1].length ; j ++ ) {//j не должна начинаться раньше последнего разрешенного индекса, j не должна увеличиться больше чем на count j не должна првысить допустимое количество элементов в массиве spiders[0][i].connects.push(spiders[1][j]); } startNext = j + 1; } spiders[0][spiders[0].length - 1].connects.push(spiders[0][0]); } } public class Spider { public function Spider() { var connects:Vector.<Spider> = new Vector.<Spider>(); } } Последний раз редактировалось Dukobpa3; 02.12.2010 в 12:04. Причина: Провтыкал последнего паука в первом круге связать с первым. |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 428
|
Надо теперь еще дизайнера сюда =)
__________________
Скажи мне кто твой друг и я скажу тебе кто твой друг |
|
|||||
|
Ох как тема развилась!!!! Не ожидал такого!
Дизайнера я нашол, только у неё сейчас времени нет, сессия на носу. Добавлено через 7 минут leofit Спасибо за доработку. Я AS3 изучаю всего 3 дня, и код у меня корявый получается. А у вас прям ничего лишнего. Пробовал свой код проверки внедрить, чтот-он не то показывает(((( Вот ссылка, я перезалил. http://uwww.narod.ru/pauk.html Добавлено через 10 минут Dukobpa3 Спасибо за код, приму на заметку. Но пока он для меня сложноват. |
|
|||||
|
А по-моему всё он там то показывает.
Только нужно учесть ситуацию когда линии сходятся встык. В таких ситуациях он показывает стык как два пересечения. (могу ошибаться, но выводы по нескольким сеансам сделал.) |
|
|||||
|
Регистрация: Dec 2009
Сообщений: 428
|
2 Aber
Код проверки в моем коде - это и есть Ваш код проверки, только измененный под цикл, что бы можно было много линий сразу считать 2 Dukobpa3 А как это "встык"? Что то не могу воспроизвести
__________________
Скажи мне кто твой друг и я скажу тебе кто твой друг |
![]() |
![]() |
Часовой пояс GMT +4, время: 11:14. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|