Просмотр полной версии : Задачка на отрезки
Известны координаты начала и конца Отрезка A и начала и конца Отрезка B. Необходимо узнать пересекаются ли они и есла да - то в какой точке. (ax1,ay1) (ax2,ax2) (bx1,by1) (bx2,by2)
Помогите плз.
О, уравнения ))
1. Составить уравнение прямой для каждого отрезка.
2.Поскольку получатся простые линейные функции - благополучно написать алгоритм, который решит систему линейных уравнений. Решение дас два числа - икс и игрек. Это будет точка пересечения прямых, на которой лежат отрезки. И проверить если эта точка входит в множество точек для каждого отрезка - стало быть пересекаются отрезки именно в этой точке. А если не входит хотябы в один - значит не пересекаются.
(Со множеством все довольно просто - координаты точки должны лежать между координатами концов отрезков для каждого отдельного случая (по иксам и по игрекам)
Готового решения у меня нет - но алгоритм таков.
алгоритм
http://algolist.manual.ru/maths/geom/intersect/lineline2d.php
Можно и просто нарисовать и хиттестить, по-идее так тоже работать будет.
Можно и просто нарисовать и хиттестить, по-идее так тоже работать будет.А как узнаешь в какой точке?
А вот мой вариант:
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;
}
}
Romias, в это разделе запрещено использование команд семилетней давности.
_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 - координаты точки пересечения
Romias, N!kE - садитесь, 2!
учите планиметрию и AS.
miramax, подскажите ошибку? ;-)
Если про AS, то просто скопируй и попробуй запустить.
Извиняюсь за использование "команд семилетней давности", но хотел бы уточнить о чём идёт речь!
Miramax, я буду очень благодарен, если ты мне объяснишь мои "ошибки".
Ну а если у кого не заработал мой скрипт, прошу вставить его в мувиклип :)!
Извиняюсь за использование "команд семилетней давности", но хотел бы уточнить о чём идёт речь!
on, onClipEvent.
Впрочем, в текущем разделе можно.
Если про AS, то просто скопируй и попробуй запустить.
работает...
работает...
Тогда у меня флеш неправильный.
**Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 14: '{' expected
var x = 300;
Total ActionScript Errors: 1 Reported Errors: 1
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.