![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Выпуклой, да, и никаких тонких частей быть не должно. Я тестировал на кртинке с гомером симпсоном ) у него на волосах не правильно точки располагаются ) Хоть там всего 3 волоска
Но для курсовой вариант вообще отличный. Можно и картинки специально подготовить |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Я делал такой обход для размещения моделей на текстуре. Совет - не векторизовать ни в коем случае. Или получите борьбу с неточностями чисел с плавающей запятой, что лечится крайне сложно.
Делать втупую - две битмапы, сдвинуть их до соприкосновения непрозрачными пикселами и потом обходить (каждый шаг обхода - сдвиг до тех пор, пока пикселы ещё касаются).
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Можно как-то этот урок лабиринта прикрутить
http://www.demiart.ru/forum/index.php?showtopic=84805 http://www.demiart.ru/forum/index.php?showtopic=46096 Ещё можно сделать четыре точки (или три), которые будут ездить по контуру, вращаясь друг относительно друга, при изменении пиксела битмапы менять точку вращения, таким образом можно перемещаться по границе, всё время цепляясь за неё одной из четырёх точек (лап) Небольшой пример package { import flash.display.*; import flash.events.*; import flash.text.*; import flash.utils.*; import flash.geom.*; /** * ... * @author Lexcuk */ public class Doc extends Sprite { private var spiderArr:Vector.<Point>, spiderTrans:Vector.<Point>; private var spiderMatrix:Matrix = new Matrix(); private var angle:Number = 0, angleStep:Number = 0.5; private var i:int; private var sprite:Sprite; private var cenRotX:Number = 0, cenRotY:Number = 0, startX:int, startY:int; private var spiralDiam:Number = 0, spiralAngle:Number = 0, spiralAnStep:Number = 0.1; private var spiTag:Boolean = false; private var curHand:int, contactStr:String = ''; private var bmd:BitmapData; public function Doc() { var sh:Shape = new Shape(); sh.graphics.beginFill(0xFF0000); sh.graphics.drawCircle(230, 200, 100); sh.graphics.drawCircle(100, 150, 40) sh.graphics.drawCircle(250, 100, 40) addChild(new Bitmap(bmd = new BitmapData(550, 400, false))); //фото в битмапдату bmd.draw(sh); addChild(sprite = new Sprite()); spiderArr = Vector.<Point>([ new Point( -5, -5), new Point(5, -5), new Point(5, 5), new Point(-5, 5) ]); spiderTrans = new Vector.<Point>(); cenRotX = spiderArr[0].x; cenRotY = spiderArr[0].y; //точка сброса startX = 50; startY = 50; addEventListener(Event.ENTER_FRAME, enterFrameHandler); } private function showSpider():void { sprite.graphics.clear(); sprite.graphics.lineStyle(0); for (i = 0; i < spiderArr.length; i++) sprite.graphics.drawCircle(spiderTrans[i].x, spiderTrans[i].y,2); } private function enterFrameHandler(e:Event):void { //если не нашли, то ищем if (!spiTag) spiderTagertLookFor(); else spiderGo(); showSpider(); } //режим первоначального поиска цели private function spiderTagertLookFor():void { //крутиться по возрастающей спирали spiderMatrix.identity(); //смещение на длину спирали spiderMatrix.translate(spiralDiam += angleStep, 0); //вращение на угол спирали spiderMatrix.rotate(spiralAngle += spiralAnStep); //смещение на точку сброса spiderMatrix.translate(startX, startY); //применение матрицы к лапам for (i = 0; i < spiderArr.length; i++) spiderTrans[i] = spiderMatrix.transformPoint(spiderArr[i]); //тестим паука на пересечение лап if (pixelTester()) spiTag = true; } //режим перемещения по цели public function spiderGo():void { //крутится относительно следующей законтаченной лапы if (curHand == 3) if (contactStr.charAt(2) == '1') curHand = 2; if (curHand == 0) if (contactStr.charAt(3) == '1') curHand = 3; if (curHand == 1) if (contactStr.charAt(0) == '1') curHand = 0; if (curHand == 2) if (contactStr.charAt(1) == '1') curHand = 1; cenRotX = spiderTrans[curHand].x; cenRotY = spiderTrans[curHand].y; //сместить матрицу паука на текущее положение лапы spiderMatrix.translate( -cenRotX, -cenRotY); //трансформировать лапы, повернув их относительно текущей лапы spiderMatrix.rotate(-angle); spiderMatrix.rotate(angle += angleStep); //вернуть лапы обратно spiderMatrix.translate( cenRotX, cenRotY); for (i = 0; i < spiderArr.length; i++) spiderTrans[i] = spiderMatrix.transformPoint(spiderArr[i]); //проверка лап pixelTester(); } private function pixelTester():Boolean { var r:Boolean; var c:uint; contactStr = ''; for (i = 0; i < spiderArr.length; i++) { c = bmd.getPixel(spiderTrans[i].x, spiderTrans[i].y); if (spiderTrans[i].x <= 0 && spiderTrans[i].y <= 0) c = 0xFFFFFF; if (c == 0xFFFFFF||c==0) { contactStr += '1'; }else { r = true; contactStr += '0'; } } return r; } } }
__________________
Гоночка Последний раз редактировалось Alex Lexcuk; 30.11.2011 в 17:48. |
|
|||||
|
Регистрация: Nov 2011
Сообщений: 3
|
Я пробовал это делать с помощью hitTestPoint, но получаеться каряво (дрыгаеться персонаж). Нужно както это воизбежать.
|
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Т.е. пофиг все варианты которые предлагали в этой теме? Как бы "ничего не вижу, ничего не слышу"?
Прийдется вам, товарищ, видимо самому разбираться со своей курсовой ) |
![]() |
![]() |
Часовой пояс GMT +4, время: 10:30. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|