Просмотр полной версии : Нахождение координат точки треугольника
djyamato
28.12.2010, 22:34
Здравствуйте
Знаю, с геометрией я не дружу, и сколько сейчас ни пытаюсь читать, не пойму как найти точку треугольника прямоугольного
Координаты точек A и B я знаю
Как узнать координаты точки C ?
Точка А, это что, центр фотографии?
djyamato
28.12.2010, 22:42
Да это центр, он не меняется, и прямая красная вертикальная двигается за левой координатой "boundRect" фотографии
А размеры фотографии доступны?
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;
}
Тогда не получится. Согласно теоремам геометрии, для того чтобы вычислить стороны треугольника (а значит и координаты), нужно знать три параметра, но не любых.
В данном случае, вам нужно знать два угла и одну сторону между ними. Сторону мы знаем, это расстояние между 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 я хочу выяснить, извините за неточность
Zebestov, как я понял, есть некая картинка, где изображение повернуто на определенный угол. А в рамки это картинки можно вписать n изображение с разными размерами. И задача вычислить исходные размеры не повернутого изображения.
координату 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 определенного цвета и проверять по этому цвету, но как-то это за уши притянуто, чтоли
25713
Вот смотрите. В одну картинку (черная рамка), я вписал два изображения с разными размерами (синяя и зеленая рамки). Красные линии задают центр обоих картинок, соответственно точку A и B, но C для синий и зеленой рамки будут разные. Поэтому без дополнительных данных, задача геометрически не решаема.
djyamato
28.12.2010, 23:35
Угол поворота я же знаю еще самой фотографии, я на него поворачиваю эту фотографию
У зеленой и синей рамки, угол поворота один и тот же, 45 градусов.
Я просто показываю пример того, что с текущими данными, размеры рамок могут быть разными, но попадающими под условия.
djyamato
28.12.2010, 23:47
ну да, верно, а какие данные еще могут сдвинуть ситуацию с места ?
До поворота получить размеры изображения.
djyamato
28.12.2010, 23:53
дело-то в том что мне не поворот нужно ограничивать, а зуммирование
Добавлено через 18 минут
Есть соотношение сторон у исходной картинки, оно неизменным остается
iflamberg
29.12.2010, 00:22
Поместите в два контейнера. Внешний для поворота, внутренний для изменения размеров.
А если попробовать так, задать прямоугольником границы в которых можно трансформировать
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 точки у картинки трансформируемой вычислить
можно ещё элементарнее) засунуть картинку в спрайт и узнать ширину спрайта с повёрнутым изображением в нём.
а по правде
ширина и высота описанного повёрнутого прямоугольника
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;
}
}
Зачем помещать изображение в спрайт, и вообще вся эта морока с высчитыванием координат точки в углу картинки, если есть getBounds()?
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.