PDA

Просмотр полной версии : Задачка на отрезки


Romias
05.01.2007, 14:38
Известны координаты начала и конца Отрезка A и начала и конца Отрезка B. Необходимо узнать пересекаются ли они и есла да - то в какой точке. (ax1,ay1) (ax2,ax2) (bx1,by1) (bx2,by2)
Помогите плз.

bbexp
05.01.2007, 14:57
О, уравнения ))

1. Составить уравнение прямой для каждого отрезка.
2.Поскольку получатся простые линейные функции - благополучно написать алгоритм, который решит систему линейных уравнений. Решение дас два числа - икс и игрек. Это будет точка пересечения прямых, на которой лежат отрезки. И проверить если эта точка входит в множество точек для каждого отрезка - стало быть пересекаются отрезки именно в этой точке. А если не входит хотябы в один - значит не пересекаются.
(Со множеством все довольно просто - координаты точки должны лежать между координатами концов отрезков для каждого отдельного случая (по иксам и по игрекам)

Готового решения у меня нет - но алгоритм таков.

vic_
05.01.2007, 16:16
алгоритм
http://algolist.manual.ru/maths/geom/intersect/lineline2d.php

wvxvw
05.01.2007, 17:21
Можно и просто нарисовать и хиттестить, по-идее так тоже работать будет.

iNils
05.01.2007, 17:35
Можно и просто нарисовать и хиттестить, по-идее так тоже работать будет.А как узнаешь в какой точке?

miramax
05.01.2007, 19:58
http://as3.ru/?p=6

Romias
06.01.2007, 00:38
А вот мой вариант:
onClipEvent (load) {
drow = false;
number = 0;
_root.my_clip._x = this._x;
_root.my_clip._y = this._y;
_root._quality = "BEST";
_root.createEmptyMovieClip('my_clip', 0);
}
onClipEvent (mouseDown) {
if (drow == false) {
if (number == 2) {
_root.createEmptyMovieClip('my_clip', 0);
number = 0;
}
if (number == 0) {
ax1 = _root._xmouse;
ay1 = _root._ymouse;
}
if (number == 1) {
bx1 = _root._xmouse;
by1 = _root._ymouse;
}
c = 16777215*Math.random();
_root.my_clip.lineStyle(2, c, 100);
_root.my_clip.moveTo(_root._xmouse, _root._ymouse);
_x = _root._xmouse;
_y = _root._ymouse;
drow = true;
} else {
if (number == 0) {
ax2 = _root._xmouse;
ay2 = _root._ymouse;
}
if (number == 1) {
bx2 = _root._xmouse;
by2 = _root._ymouse;
k1 = (ay1-ay2)/(ax1-ax2);
b1 = ay1-k1*ax1;
k2 = (by1-by2)/(bx1-bx2);
b2 = by1-k2*bx1;
if (k1 == k2) {
if (b1 == b2) {
trace('DA, Sovpadaut');
} else {
trace('NET!');
}
} else {
x = (b1-b2)/(k2-k1);
y = (k2*b1-k1*b2)/(k2-k1);
if ((x>=((ax1<ax2) ? ax1 : ax2)) & (x>=((bx1<bx2) ? bx1 : bx2)) & (x<=((ax1>ax2) ? ax1 : ax2)) & (x<=((bx1>bx2) ? bx1 : bx2)) & (y>=((ay1<ay2) ? ay1 : ay2)) & (y>=((by1<by2) ? by1 : by2)) & (y<=((ay1>ay2) ? ay1 : ay2)) & (y<=((by1>by2) ? by1 : by2))) {
trace('DA');
} else {
trace('NET');
}
}
}
_root.my_clip.moveTo(this._x, this._y);
_root.my_clip.lineTo(_root._xmouse, _root._ymouse);
_x = _root._xmouse;
_y = _root._ymouse;
drow = false;
number += 1;
}
}
onClipEvent (enterFrame) {
if (drow == false) {
_x = _root._xmouse;
_y = _root._ymouse;
}
}

etc
06.01.2007, 03:33
Romias, в это разделе запрещено использование команд семилетней давности.

N!kE
06.01.2007, 09:23
_root.createEmptyMovieClip("clip", 1);
clip.lineStyle(0, 0x000000, 100);
line1 = {};
line1.m = 1;
line1.b = 100;
line2 = {};
line2.m = 3;
line2.b = 50;
function findY(line, x) {
var y = line.m*x+line.b;
return y;
}
function drawLine(line)
var x = 300;
var y = findY(line, x);
var x = 0;
var y = findY(line, x);
clip.lineTo(x, y);
}
function findIntersection(line_a, line_b) {
var x = (line_b.b-line_a.b)/(line_a.m-line_b.m);
var y = line_a.m*x+line_a.b;
dot._x = x;
dot._y = y;
}
drawLine(line1);
drawLine(line2);
findIntersection(line1, line2);

dot._x & dot._y - координаты точки пересечения

miramax
06.01.2007, 10:54
Romias, N!kE - садитесь, 2!
учите планиметрию и AS.

N!kE
06.01.2007, 13:16
miramax, подскажите ошибку? ;-)

etc
06.01.2007, 13:31
Если про AS, то просто скопируй и попробуй запустить.

Romias
06.01.2007, 13:41
Извиняюсь за использование "команд семилетней давности", но хотел бы уточнить о чём идёт речь!
Miramax, я буду очень благодарен, если ты мне объяснишь мои "ошибки".
Ну а если у кого не заработал мой скрипт, прошу вставить его в мувиклип :)!

etc
06.01.2007, 13:57
Извиняюсь за использование "команд семилетней давности", но хотел бы уточнить о чём идёт речь!

on, onClipEvent.
Впрочем, в текущем разделе можно.

N!kE
06.01.2007, 14:32
Если про AS, то просто скопируй и попробуй запустить.
работает...

etc
06.01.2007, 14:42
работает...
Тогда у меня флеш неправильный.
**Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 14: '{' expected
var x = 300;

Total ActionScript Errors: 1 Reported Errors: 1