![]() |
|
||||||||||
|
|||||
|
Задача:
Задана полуплоскость через точку, лежащую на граничной прямой и нормаль к прямой. Нужно отрисовать это дело на Shape(т.е. тупо на Graphics). Моё решение такое: //levelx, levely - точка на прямой //nx, ny - нормаль //рисую просто большой прямоугольник, который в конечном итоге не виден за границами окна public function draw():void { canvas.graphics.beginFill(0x0000FF,0.2); var x1:Number; var y1:Number; var x2:Number; var y2:Number; x1=levelx-1000*ny; y1=levely+1000*nx; x2=levelx+1000*ny; y2=levely-1000*nx; canvas.graphics.moveTo(x1,y1); canvas.graphics.lineTo(x2,y2); canvas.graphics.lineTo(x2+1000*nx,y2+1000*ny); canvas.graphics.lineTo(x1+1000*nx,y1+1000*ny); canvas.graphics.lineTo(x1,y1); canvas.graphics.endFill(); } |
|
|||||
|
блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
|
Во флеш нет такой возможности. Вы выбрали правильное направление, но думаю лучше рисовать трапецию ограниченную по экрану — так флеш плееру не придется пытаться рисовать заведомоневидимые участки фигуры.
|
|
|||||
|
Флэш по сути сам должен clipping делать.. но лучше и вправду сделаю трапецию.
В принципе параметры этой плоскости изменяются редко, так что можно 1 раз посчитать координаты трапеции, сделать из него Path и потом тупо drawPath с заливкой делать.. спасибо за ответ Добавлено через 4 часа 5 минут Сделал, но получилось довольно громоздко. Если кому вдруг пригодится: var command:Vector.<int>; var coord:Vector.<Number>; //... //Рисуем полуплоскость public function draw():void { if (visible) { canvas.graphics.beginFill(Color); canvas.graphics.drawPath(command,coord); canvas.graphics.endFill(); } } //Пересчёт области, изображающей полуплоскость private function recalcPath():void { var w:Number; var h:Number; var b1:Boolean; var b2:Boolean; var b3:Boolean; var b4:Boolean; w=canvas.stage.width; h=canvas.stage.height; b1=(_levelx*_nx +_levely*_ny>0); b2=((_levelx-w)*_nx +_levely*_ny>0); b3=((_levelx-w)*_nx +(_levely-h)*_ny>0); b4=(_levelx*_nx +(_levely-h)*_ny>0); command=new Vector.<int>; coord=new Vector.<Number>; if(!(b1 || b2 || b3 || b4)) return; command.push(GraphicsPathCommand.MOVE_TO); if(b1 && b2 && b3 && b4) { coord.push(0,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,0); return; } if(b4 && !b1 && b2) { coord.push(w,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,_levely+_levelx*_ny/_nx); command.push(GraphicsPathCommand.LINE_TO); coord.push(_levelx+_levely*_nx/_ny,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,0); return; } if(b1 && !b2 && b3) { trace(4); coord.push(w,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(_levelx+_levely*_ny/_nx,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,_levely+(_levelx-w)*_nx/_ny); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,h); return; } if(b2 && !b3 && b4) { coord.push(0,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,_levely+(_levelx-w)*_nx/_ny); command.push(GraphicsPathCommand.LINE_TO); coord.push(_levelx+(_levely-h)*_ny/_nx,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,h); return; } if(b3 && !b4 && b1) { coord.push(0,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(_levelx+(_levely-h)*_ny/_nx,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,_levely+_levelx*_nx/_ny); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,h); return; } if(!b4 && b1 && !b2) { coord.push(0,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(_levelx+_levely*_ny/_nx,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,_levely+_levelx*_nx/_ny); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,0); return; } if(!b1 && b2 && !b3) { coord.push(w,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,_levely+(_levelx-w)*_nx/_ny); command.push(GraphicsPathCommand.LINE_TO); coord.push(_levelx+_levely*_ny/_nx,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,0); return; } if(!b2 && b3 && !b4) { coord.push(w,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(_levelx+(_levely-h)*_ny/_nx,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,_levely+(_levelx-w)*_nx/_ny); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,h); return; } if(b1 && b2) { coord.push(0,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,_levely+(_levelx-w)*_nx/_ny); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,_levely+_levelx*_nx/_ny); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,0); return; } if(b2 && b3) { coord.push(w,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(_levelx+(_levely-h)*_ny/_nx,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(_levelx+_levely*_ny/_nx,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,0); return; } if(b3 && b4) { coord.push(w,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,_levely+_levelx*_nx/_ny); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,_levely+(_levelx-w)*_nx/_ny); command.push(GraphicsPathCommand.LINE_TO); coord.push(w,h); return; } if(b4 && b1) { coord.push(0,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(_levelx+_levely*_ny/_nx,0); command.push(GraphicsPathCommand.LINE_TO); coord.push(_levelx+(_levely-h)*_ny/_nx,h); command.push(GraphicsPathCommand.LINE_TO); coord.push(0,h); return; } } |
![]() |
![]() |
Часовой пояс GMT +4, время: 07:46. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| геометрия , незамкнутая область , полуплоскость |
| Опции темы | |
| Опции просмотра | |
|
|