australian incognito
23.12.2014, 14:12
Похоже, задачка для 10 класса алгебры, но все же:
Есть кривая безье, отрисованная с помощью curveTo (т.е. 2 точки и точка кривизны) и прямая линия, заданная 2 точками. Подскажите составить условие их пересечения (если это упростит задачу, то прямая линия параллельна оси Х)?
nubideus
23.12.2014, 15:46
(если это упростит задачу, то прямая линия параллельна оси Х)да. сначала находишь t, потом находишь y
если прямая не параллельна осям то
http://www.flasher.ru/forum/showpost.php?p=1043611&postcount=4
Добавлено через 6 часов 40 минут
квадратичное уравнение безье(для трех точек):p4 = t*(t*(p3 - p2*2 + p1) + 2*(p2 - p1)) + p1
мутируешь его в квадратное уравнение:t*t*(p3 - p2*2 + p1) + t*2*(p2 - p1) + p1 - p4 = 0
http://www.flasher.ru/forum/showpost.php?p=1172072&postcount=2
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 лежит на кривой
}
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
Спасибо большое. Ушел "переваривать"...
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.