|
|
|||||
Регистрация: Jun 2011
Сообщений: 60
|
Вроде бы не должно возникать каких-либо проблем с программной отрисовкой. Контрольные точки curveTo в углах будут стоять.
|
|
|||||
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,112
Записей в блоге: 1
|
import flash.display.Graphics; import flash.geom.Point; import flash.events.MouseEvent; function drawTrapezium(drawTo:Graphics, points:Array, cornerRaduis:Number = 0):void { // top line var angle_0_1:Number = Math.atan2(points[1].y - points[0].y,points[1].x - points[0].x); var x1:Number = points[0].x + Math.cos(angle_0_1) * cornerRaduis; var y1:Number = points[0].y + Math.sin(angle_0_1) * cornerRaduis; var angle_1_0:Number = Math.atan2(points[0].y - points[1].y,points[0].x - points[1].x); var x2:Number = points[1].x + Math.cos(angle_1_0) * cornerRaduis; var y2:Number = points[1].y + Math.sin(angle_1_0) * cornerRaduis; // drawTo.moveTo(x1, y1); drawTo.lineTo(x2, y2); // right line var angle_1_2:Number = Math.atan2(points[2].y - points[1].y,points[2].x - points[1].x); var x3:Number = points[1].x + Math.cos(angle_1_2) * cornerRaduis; var y3:Number = points[1].y + Math.sin(angle_1_2) * cornerRaduis; var angle_2_1:Number = Math.atan2(points[1].y - points[2].y,points[1].x - points[2].x); var x4:Number = points[2].x + Math.cos(angle_2_1) * cornerRaduis; var y4:Number = points[2].y + Math.sin(angle_2_1) * cornerRaduis; // drawTo.curveTo(points[1].x, points[1].y, x3,y3); drawTo.lineTo(x4, y4); // bottom line var angle_2_3:Number = Math.atan2(points[3].y - points[2].y,points[3].x - points[2].x); var x5:Number = points[2].x + Math.cos(angle_2_3) * cornerRaduis; var y5:Number = points[2].y + Math.sin(angle_2_3) * cornerRaduis; var angle_3_2:Number = Math.atan2(points[2].y - points[3].y,points[2].x - points[3].x); var x6:Number = points[3].x + Math.cos(angle_3_2) * cornerRaduis; var y6:Number = points[3].y + Math.sin(angle_3_2) * cornerRaduis; // drawTo.curveTo(points[2].x, points[2].y, x5,y5); drawTo.lineTo(x6, y6); // left line var angle_3_4:Number = Math.atan2(points[0].y - points[3].y,points[0].x - points[3].x); var x7:Number = points[3].x + Math.cos(angle_3_4) * cornerRaduis; var y7:Number = points[3].y + Math.sin(angle_3_4) * cornerRaduis; var angle_4_3:Number = Math.atan2(points[3].y - points[0].y,points[3].x - points[0].x); var x8:Number = points[0].x + Math.cos(angle_4_3) * cornerRaduis; var y8:Number = points[0].y + Math.sin(angle_4_3) * cornerRaduis; // drawTo.curveTo(points[3].x, points[3].y, x7,y7); drawTo.lineTo(x8, y8); drawTo.curveTo(points[0].x, points[0].y, x1,y1); } var points:Array = [new Point(20,20),new Point(200,30),new Point(200,250),new Point(20,240)]; stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); function mouseMoveHandler(e:MouseEvent):void{ this.graphics.clear(); this.graphics.lineStyle(1); points[2].x = stage.mouseX; points[2].y = stage.mouseY; drawTrapezium(this.graphics, points, 20); } mouseMoveHandler(null) Добавлено через 13 минут Я не хотел выносить основные методы в отдельную вспомогательную функцию, но, в принципе, с таким же успехом можно сделать рисование n-угольника со скругленными краями.
__________________
hauts.ru |
|
|||||
Минимум геометрии - рисуем многоугольник с кругленными краями:
package { import flash.display.Graphics; import flash.display.GraphicsPathCommand; import flash.display.Sprite; import flash.geom.Point; public class Main extends Sprite { public function Main() { graphics.lineStyle(1); drawRoundPoly(graphics, [ new Point(100, 100), new Point(250, 100), new Point(300, 200), new Point(50, 200) ], 20); } private function drawRoundPoly(graphics:Graphics, points:Array, radius:Number):void { if (!points || points.length < 3 || radius <= 0) { throw new Error("..."); } var commands:Vector.<int> = Vector.<int>([GraphicsPathCommand.MOVE_TO]); var data:Vector.<Number> = new Vector.<Number>(); var n:Vector.<Number> = new Vector.<Number>(); var len:int = points.length; points.push(points[0], points[1]); // последняя точка - замыкает, и нам понадобится еще и вторая точка, для вычисления дуги for (var i:int = 0; i < len; i++) { commands.push(GraphicsPathCommand.LINE_TO, GraphicsPathCommand.CURVE_TO); n.push(radius / Point.distance(points[i], points[i + 1])); }; n.push(n[0]); //move_to var p:Point = Point.interpolate(points[1], points[0], n[0]); data.push(p.x, p.y); for (i = 0; i < len; i++) { //line_to p = Point.interpolate(points[i], points[i + 1], n[i]); data.push(p.x, p.y); // curve_to p = Point.interpolate(points[i + 2], points[i + 1], n[i + 1]); data.push(points[i + 1].x, points[i + 1].y, p.x, p.y); } graphics.drawPath(commands, data); points.splice(len, 2); } } } |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Я так понял, на радиус все дружно забили?
То, что применимо к прямому углу (и то, в случае с curveTo() — с большими оговорками), не применимо к другим углам вообще.
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 23.11.2012 в 14:17. |
Часовой пояс GMT +4, время: 00:14. |
|
« Предыдущая тема | Следующая тема » |
Теги |
трапеция graphics |
|
|