Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Пересечение кривой безье и прямой линии, как проверить? (http://www.flasher.ru/forum/showthread.php?t=209803)

australian incognito 23.12.2014 14:12

Пересечение кривой безье и прямой линии, как проверить?
 
Похоже, задачка для 10 класса алгебры, но все же:
Есть кривая безье, отрисованная с помощью
Код AS1/AS2:

curveTo

(т.е. 2 точки и точка кривизны) и прямая линия, заданная 2 точками. Подскажите составить условие их пересечения (если это упростит задачу, то прямая линия параллельна оси Х)?

nubideus 23.12.2014 15:46

Цитата:

(если это упростит задачу, то прямая линия параллельна оси Х)
да. сначала находишь t, потом находишь y


если прямая не параллельна осям то
http://www.flasher.ru/forum/showpost...11&postcount=4

Добавлено через 6 часов 40 минут
квадратичное уравнение безье(для трех точек):
Код AS3:

p4 = t*(t*(p3 - p2*2 + p1) + 2*(p2 - p1)) + p1

мутируешь его в квадратное уравнение:
Код AS3:

t*t*(p3 - p2*2 + p1) + t*2*(p2 - p1) + p1 - p4 = 0

http://www.flasher.ru/forum/showpost...72&postcount=2

Код AS3:

var a = (p3 - p2*2 + p1);
var b = 2*(p2 - p1);
var c = p1 - p4;
 
var t1 = (-b + Math.sqrt(b*b - 4*a*c)) / (2*a);
var t2 = (-b - Math.sqrt(b*b - 4*a*c)) / (2*a);
 
if(t1 >= 0 && t1 <= 1){
  // t1 лежит на кривой
}
 
if(t2 >= 0 && t2 <= 1){
  // t2 лежит на кривой
}

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.geom.Point;
 
        public class Main extends Sprite
        {
                private var p1:Point = new Point(10, 10);
                private var p2:Point = new Point(100, 300);
                private var p3:Point = new Point(200, 40);
 
                var liney:Number = 0;
 
                public function Main() {
                        addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }
 
                function quadraticBezier(p1, p2, p3, t){
                        return t*(t*(p3 - p2*2 + p1) + 2*(p2 - p1)) + p1;
                }
                private function onEnterFrame(event:Event = null):void {
                        this.graphics.clear()
 
                        liney++;
                        if (liney > 200) liney = 0;
 
                        var a = p3.y - p2.y*2 + p1.y;
                        var b = 2*(p2.y - p1.y);
                        var c = p1.y - liney;
 
                        var t1 = (-b + Math.sqrt(b*b - 4*a*c)) / (2*a);
                        var t2 = (-b - Math.sqrt(b*b - 4*a*c)) / (2*a);
 
                        this.graphics.lineStyle(1, 0x000000);
                        this.graphics.moveTo(0, liney);
                        this.graphics.lineTo(300, liney);
 
                        this.graphics.lineStyle(1, 0x000000);
                        this.graphics.moveTo(p1.x, p1.y);
                        this.graphics.curveTo(p2.x, p2.y, p3.x, p3.y);
                        this.graphics.lineStyle(2, 0xFF0000);
                        if(t1 * (t1 - 1) < 0){
                                // t1 лежит на кривой
                                var newPoint:Point = new Point();
                                newPoint.x = quadraticBezier(p1.x, p2.x, p3.x, t1);
                                newPoint.y = quadraticBezier(p1.y, p2.y, p3.y, t1);
                                this.graphics.drawCircle(newPoint.x, newPoint.y, 2);
                        }
 
                        if(t2 * (t2 - 1) < 0){
                                // t2 лежит на кривой
                                var newPoint:Point = new Point();
                                newPoint.x = quadraticBezier(p1.x, p2.x, p3.x, t2);
                                newPoint.y = quadraticBezier(p1.y, p2.y, p3.y, t2);
                                this.graphics.drawCircle(newPoint.x, newPoint.y, 2);
                        }
                }
        }
}


australian incognito 24.12.2014 14:37

Спасибо большое. Ушел "переваривать"...


Часовой пояс GMT +4, время: 15:12.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.