![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Похоже, задачка для 10 класса алгебры, но все же:
Есть кривая безье, отрисованная с помощью (т.е. 2 точки и точка кривизны) и прямая линия, заданная 2 точками. Подскажите составить условие их пересечения (если это упростит задачу, то прямая линия параллельна оси Х)?
__________________
Игра "Пушкин" |
|
|||||
|
Регистрация: Jan 2013
Сообщений: 322
|
Цитата:
если прямая не параллельна осям то http://www.flasher.ru/forum/showpost...11&postcount=4 Добавлено через 6 часов 40 минут квадратичное уравнение безье(для трех точек): мутируешь его в квадратное уравнение: http://www.flasher.ru/forum/showpost...72&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); } } } } Последний раз редактировалось nubideus; 02.01.2015 в 03:04. Причина: t2 <= 2 омг |
|
|||||
|
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Спасибо большое. Ушел "переваривать"...
__________________
Игра "Пушкин" |
![]() |
![]() |
Часовой пояс GMT +4, время: 14:27. |
|
|
« Предыдущая тема | Следующая тема » |
|
|