Форум 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=106389)

Сандра 10.01.2008 16:52

Есть две точки (Point), представляющие собой вектор. Необходимо найти третью точку, которая должна располагаться посередине отрезка, проведенного между двумя этими точками.

Как это лучше всего сделать по-науке? Буду благодарна за кусок кода!

Дело в том, что когда начинаешь это делать ручками, то все получается до тех пор, пока координаты не становятся отрицательными.

iNils 10.01.2008 17:25

Код:

x1 = 5;
y1 = 5;
x2 = 15;
y2 = 15;
////
x3 = x1 + (x2 - x1) / 2;
y3 = y1 + (y2 - y1) / 2;
trace (x3);
trace (y3);


2morrowMan 10.01.2008 18:02

Код:

ActionScript 2.0 Language Reference
       
 
ActionScript classes > Point (flash.geom.Point) > subtract (Point.subtract method) 
 

subtract (Point.subtract method)
public subtract(v:Point) : Point

Subtracts the coordinates of another point from the coordinates of this point to create a new point.

Availability: ActionScript 1.0; Flash Player 8

Parameters
v:Point - The point to be subtracted.

Returns
Point - The new point.

Example
The following example creates point_3 by subtracting point_2 from point_1.

import flash.geom.Point;
var point_1:Point = new Point(4, 8);
var point_2:Point = new Point(1, 2);
var resultPoint:Point = point_1.subtract(point_2);
trace(resultPoint.toString()); // (x=3, y=6)


Сандра 10.01.2008 18:59

Спасибо! А теперь немного посложнее задача, есть переменные a и b:

Код:

var a = _root._xmouse;
var b = _root._ymouse;

Как найти координаты x3 и y3, таким образом, чтобы они лежали на заданном отрезке (который, как следует из самого первого условия задан координатами x1, y1 и x2, y2) и чтобы курсор мышки был максимально приближен к этой точке?

koIIImarik 11.01.2008 00:27

Вы хотите программно навести курсор на эту точку, или что? А найти точку:

Код:

x1 = 5;
y1 = 5;
x2 = 15;
y2 = 15;
////
x3 = (x2-x1)+x2;
y3 = (y2-y1)+y2;
trace (x3);
trace (y3);

На сколько я понимаю так. Ну или, делайте x2*2-x1, и так же с y2.

Freeeeeeeman 11.01.2008 01:14

Вложений: 1
Делается так, по законам геометрии. Уже моск не работает, чтобы формулы вспоминать.
Для этого надо находить точки пересечения катетов с вектором, чтобы узнать их длину, после узнать гипотенузу, проецировать на вектор, узнать расположение точки, если я не ошибаюсь. Хотя мне кажется, что можно намного проще.

wvxvw 11.01.2008 02:06

Код:

var line_mc:MovieClip = _root.createEmptyMovieClip('line_mc',0);
var middle_mc:MovieClip = rct(this,10,10,0xff,50);
function rct(mc:MovieClip,w:Number,h:Number,c:Number,a:Number):MovieClip {
        var _mc:MovieClip = mc.createEmptyMovieClip("mc"+mc.getNextHighestDepth(),mc.getNextHighestDepth());
        _mc.beginFill(c,a);
        _mc.lineTo(w,0);
        _mc.lineTo(w,h);
        _mc.lineTo(0,h);
        _mc.lineTo(0,0);
        _mc.endFill();
        return _mc;
}
middle_mc.lineStyle(1,0,100);
middle_mc.lineTo(10,10);
middle_mc.moveTo(0,10);
middle_mc.lineTo(10,0);
//
function drawRotatedLine():Void {
        line_mc.clear();
        line_mc.lineStyle(1,0,100);
        line_mc.moveTo(Stage.width/2,Stage.height/2);
        line_mc.lineTo(_xmouse,_ymouse);
        middle_mc._x = Stage.width/2-(Stage.width/2-_xmouse)/2-5;
        middle_mc._y = Stage.height/2-(Stage.height/2-_ymouse)/2-5;
}
_root.onMouseMove = drawRotatedLine;


iNils 11.01.2008 02:30

Freeeeeeeman получает плюс за моск.

goarcade 11.01.2008 03:26

Цитата:

Сообщение от Сандра
Спасибо! А теперь немного посложнее задача, есть переменные a и b:

Код:

var a = _root._xmouse;
var b = _root._ymouse;

Как найти координаты x3 и y3, таким образом, чтобы они лежали на заданном отрезке (который, как следует из самого первого условия задан координатами x1, y1 и x2, y2) и чтобы курсор мышки был максимально приближен к этой точке?

Код:

onEnterFrame = function () {
        var dx:Number = b._x-a._x;
        var dy:Number = b._y-a._y;
        var t:Number = (_xmouse*dx-a._x*dx+_ymouse*dy-a._y*dy)/(dx*dx+dy*dy);
        if(t>1)t=1;
        if(t<0)t=0;
        c._x = a._x+(b._x-a._x)*t;
        c._y = a._y+(b._y-a._y)*t;
};

mcDrag("a");a._x = 50; a._y = 50;
mcDrag("b");b._x = 150; b._y = 150;
mcDrag("c");delete c.onPress;

function mcDrag(name:String)
{
        var mc:MovieClip = _root.createEmptyMovieClip(name,_root.getNextHighestDepth());
        mc.beginFill(0xcccccc*Math.random());
        var r:Number = 5;
        mc.moveTo(-r,-r);
        mc.lineTo( r,-r);
        mc.lineTo( r, r);
        mc.lineTo(-r, r);
        mc.endFill();
        mc.onPress=function(){this.startDrag()}
        mc.onMouseUp=function(){this.stopDrag()}       
}

Если непонятна математика - могу объяснить:)

alekslitvinenk 11.01.2008 04:20

А не прще-ли использовать
Код:

Point.interpolate(pt1, pt2, 0.5);
для нахождения координат точки середины отрезка ?

Сандра 11.01.2008 13:06

Цитата:

Сообщение от goarcade
Если непонятна математика - могу объяснить:)

Объясните, если не сложно :rolleyes:


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

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