PDA

Просмотр полной версии : Нахождение координат точки треугольника


djyamato
28.12.2010, 22:34
Здравствуйте
Знаю, с геометрией я не дружу, и сколько сейчас ни пытаюсь читать, не пойму как найти точку треугольника прямоугольного

Координаты точек A и B я знаю
Как узнать координаты точки C ?

iNils
28.12.2010, 22:40
Точка А, это что, центр фотографии?

djyamato
28.12.2010, 22:42
Да это центр, он не меняется, и прямая красная вертикальная двигается за левой координатой "boundRect" фотографии

iNils
28.12.2010, 22:44
А размеры фотографии доступны?

djyamato
28.12.2010, 22:46
изначальные размеры фотографии известны
ее можно поворачивать, увеличивать и уменьшать (в том числе и повернутую)

дело вот в чем:
мне нужно узнать как раз-таки размеры по ширине и по высоте этой фотографии (как если бы она не была повернута)

И ограничивать зуммирование если ширина (большая сторона) ФОТОГРАФИИ (не "boundRect") больше 250

Zebestov
28.12.2010, 22:54
function gimmeMyC(A:Point, B:Point, W:Number, H:Number):Point
{
var AC:Number = Math.sqrt( W*W + H*H) / 2;
var AB:Number = A.x - B.x;
var BC:Number = Math.sqrt (AC*AC - AB*AB);

var C:Point = new Point();
C.x = B.x;
C.y = B.y + BC; // ну это в данном случае

return C;
}

iNils
28.12.2010, 22:55
Тогда не получится. Согласно теоремам геометрии, для того чтобы вычислить стороны треугольника (а значит и координаты), нужно знать три параметра, но не любых.
В данном случае, вам нужно знать два угла и одну сторону между ними. Сторону мы знаем, это расстояние между A и B. Один угол тоже знаем, это 90 градусов, между B и С. Нужен еще угол между A и C.
Поэтому геометрически, по текущим данным, задача не решаема. Однако, если фон всегда однотонный, в данном случаи белый (c jpeg будут проблемы, там фон хоть и кажется белым, но на самом деле градиентный), можно узнать координаты точек с помощью проверки пикселей по краю на цвет.
Я писал как-то такой алгоритм для as1/2, но вот не помню, выкладывал я его на форум или нет.

Zebestov
28.12.2010, 22:56
а вообще забавные условия задачи ) координаты точки B он знает, а C нет ) это как получилось?

djyamato
28.12.2010, 22:58
координату Y у точки C я хочу выяснить, извините за неточность

iNils
28.12.2010, 23:00
Zebestov, как я понял, есть некая картинка, где изображение повернуто на определенный угол. А в рамки это картинки можно вписать n изображение с разными размерами. И задача вычислить исходные размеры не повернутого изображения.

iNils
28.12.2010, 23:01
координату Y у точки B я хочу выяснить, извините за неточностьЧто тут выяснять? Y у B равен Y у A.

Zebestov
28.12.2010, 23:04
iNils — вот теперь понял. Есть некий фрейм, за пределы которого не должно выходить изображение при любом масштабе и повороте? Ну ща попробуем )

djyamato
28.12.2010, 23:04
Мне нужно знать ширину/высоту, в общем, величину наибольшей из сторон при повороте и дальнейшем зуммировании

Для этого я и хочу найти координаты точек крайних и найти расстояние между левой и верхней и расстояние между верхней и правой
Если наибольшее из этих расстояний более 250 то дальше не давать уменьшать зум

Zebestov
28.12.2010, 23:09
Не, ну так же ничего не понятно! Вот тут (http://www.flasher.ru/forum/showpost.php?p=960624&postcount=12) я правильно понял задачу?

djyamato
28.12.2010, 23:11
Что тут выяснять? Y у B равен Y у A.
Y координату у точки C, простите за описку

djyamato
28.12.2010, 23:15
вот сама флэшка http://divisionby0.org/web_Portfolio/crop/cropper.html
После поворота, если юзер нажимает на уменьшение и если бОльшая из сторон картинки меньше 250, то я запрещаю дальнейшее уменьшение
Трансформирую матрицей картинку так что width у нее меняется

djyamato
28.12.2010, 23:28
Однако, если фон всегда однотонный, в данном случаи белый (c jpeg будут проблемы, там фон хоть и кажется белым, но на самом деле градиентный), можно узнать координаты точек с помощью проверки пикселей по краю на цвет.

Но можно попробовать обвести картинку линией пикселя в 2 определенного цвета и проверять по этому цвету, но как-то это за уши притянуто, чтоли

iNils
28.12.2010, 23:31
25713

Вот смотрите. В одну картинку (черная рамка), я вписал два изображения с разными размерами (синяя и зеленая рамки). Красные линии задают центр обоих картинок, соответственно точку A и B, но C для синий и зеленой рамки будут разные. Поэтому без дополнительных данных, задача геометрически не решаема.

djyamato
28.12.2010, 23:35
Угол поворота я же знаю еще самой фотографии, я на него поворачиваю эту фотографию

iNils
28.12.2010, 23:43
У зеленой и синей рамки, угол поворота один и тот же, 45 градусов.
Я просто показываю пример того, что с текущими данными, размеры рамок могут быть разными, но попадающими под условия.

djyamato
28.12.2010, 23:47
ну да, верно, а какие данные еще могут сдвинуть ситуацию с места ?

iNils
28.12.2010, 23:48
До поворота получить размеры изображения.

djyamato
28.12.2010, 23:53
дело-то в том что мне не поворот нужно ограничивать, а зуммирование

Добавлено через 18 минут
Есть соотношение сторон у исходной картинки, оно неизменным остается

iflamberg
29.12.2010, 00:22
Поместите в два контейнера. Внешний для поворота, внутренний для изменения размеров.

samana
29.12.2010, 00:42
А если попробовать так, задать прямоугольником границы в которых можно трансформировать
var stageRect:Rectangle=new Rectangle(0,0,550,400);
узнать локальные координаты картинки по всем сторонам
var rectImage:Rectangle=image.getRect(image);
и постоянно проецировать эти координаты на сцену, узнавать какие у них глобальные координаты, для каждой точки конечно отдельно
var p1:Point=image.localToGlobal(new Point(rectImage.x,rectImage.y))
var p2:Point=image.localToGlobal(new Point(rectImage.x,rectImage.y))
var p3:Point=image.localToGlobal(new Point(rectImage.x,rectImage.y))
var p4:Point=image.localToGlobal(new Point(rectImage.x,rectImage.y))
а потом проверять, что если ни одна из точек не выходит за область где можно трансформировать, то трансформировать можно
if(stageRect.containsPoint(p1) && stageRect.containsPoint(p2) && stageRect.containsPoint(p3) && stageRect.containsPoint(p4))
{
//разрешать трансформацию
}

Как-то так.
--------------------------------------
Извиняюсь, я всё таки не правильно понял задачу, и нагородил не по теме.

djyamato
29.12.2010, 01:39
помог мне решить задачку товарищ, я не знаю что он использовал но если вертеть против часовой стрелки, получается найти эту точку и не ошибается алгоритм

registrationPoint- точка относительно которой крутится картинка
contentSprite.getRect(ThisWindow).x - координата по X красной вертикальной линии
WDividedByH - ширина изначальной картинки, разделенная на высоту


graphics.clear();
graphics.lineStyle(1,0xFF0000,1);
graphics.moveTo(registrationPoint.x,registrationPoint.y);
var B:Point=new Point(contentSprite.getRect(ThisWindow).x,registrationPoint.y)
var AB:Number=Point.distance(B,registrationPoint);
var BC=AB/Math.tan(Math.atan(WDividedByH)+Math.abs(MAINROTATION));
graphics.lineTo(contentSprite.getRect(ThisWindow).x,registrationPoint.y-BC);

djyamato
12.01.2011, 15:02
Пропустил я один великолепный метод у марицы (transformPoint)
Он отдает точку после применения к одной из точек матрицы трансформации
А картинку-то я кручу матрицей :)
вот и получается что без тригонометрии можно эти 4 точки у картинки трансформируемой вычислить

kseniya
12.01.2011, 16:16
можно ещё элементарнее) засунуть картинку в спрайт и узнать ширину спрайта с повёрнутым изображением в нём.
а по правде
ширина и высота описанного повёрнутого прямоугольника
w = qwe._width;
h = qwe._height;
a = 20* Math.PI / 180;
cos_a = Math.cos(a);
sin_a = Math.sin(a);
hypotH = (sin_a * w - cos_a * h) / (sin_a * sin_a - cos_a * cos_a);
hypotW = (w - sin_a * hypotH) / cos_a;

вписанного в повёрнутый прямоугольник

w = 200;
h = 150;
i = 360;
function onEnterFrame()
{
qwe._rotation = i;
i2 = (i - 360) * -1;
qwe._x = qwe._width / 2;
qwe._y = qwe._height / 2;
d = i2;
a = d * Math.PI / 180;
xx = h * w / (2 * Math.cos(a) * (h + w * Math.tan(a)));
//xx = (-(w * w) / (2 * Math.sin(a) * (w * (1 / Math.tan(a)) + h)));
yy = (xx * h / w);
//qwe2._x = (qwe._width / 2) - xx;
//qwe2._y = (qwe._height / 2) - yy;
qwe2._x = (qwe._width / 2) + xx;
qwe2._y = (qwe._height / 2) - yy;
//qwe2._width = xx * (-2);
//qwe2._height = yy * (-2);
qwe2._width = xx * (2);
qwe2._x = qwe2._x - qwe2._width;
qwe2._height = yy * (2);
--i;
if (i < 315)
{
i = 360;
}
}

Hidest
12.01.2011, 17:28
Зачем помещать изображение в спрайт, и вообще вся эта морока с высчитыванием координат точки в углу картинки, если есть getBounds()?