Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Математически описать объект (http://www.flasher.ru/forum/showthread.php?t=126730)

Barzometr 25.06.2009 20:20

Математически описать объект
 
Добрый день.

на поле расположены объекты различные. Предположим все они прямоугольного типа.

Есть некоторые объекты, которые состоят только из одного прямоугольника - такой объект легко описать, просто узнаем его координаты, длину, ширину. И все. Его можно потом нарисовать заново.


А вот как быть со сложными объектами? КОторые состоят например из 3-4 прямоугольников, которые наложены друг на друга, и формируют например букву "П". (3и прямоугольника как видно).

Вот как его описать? Координаты взяли, а как описать длину, высоту, изогнутости?


Спасибо :)

Kuruki 25.06.2009 20:28

Описать по отдельности каждую часть

Barzometr 25.06.2009 20:31

а если эти части слиты в едино? Т.е. он не состоит из отдельных movieClip, а это один целый объект.

Яски 25.06.2009 20:43

Ну полигоном, например. В массив записать каждую вершину(x, y), идя в одном направлении по контуру.
Отрисовывать потом будет легко:
Код AS3:

var point:Point = points[0];
graphics.moveTo(point.x, point.y);
for (var i:int = 1; i < points.length; i++) {
  point = points[i];
  graphics.lineTo(point.x, point.y);
}
if (closed) {
  // Если полигон замкнутый
  point = points[0];
  graphics.lineTo(point.x, point.y);
}


Barzometr 25.06.2009 21:45

так.. немного не понял - а как определить эти вершины автоматически?
что это за переменная points?

или ты предлагаешь, самому вписать в массив вершины?

Яски 25.06.2009 22:09

ну да, самому

Barzometr 25.06.2009 22:15

грустно очень :).

порыскал по форуму, нашол тему, там обсуждалось такой же вопрос и предложили использовать bitmapData, но не описали ничего.

Как с помошью битмап сделать это? Или действительно, только ручками все делать?

Stargazer 25.06.2009 22:36

Других путей нельзя найти? Откуда взялись эти странные объекты? Нельзя ли при их создании сразу дополнять их информацией о контурах?

Яски 25.06.2009 23:41

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

Barzometr 26.06.2009 00:21

объекты отрисованы вручную. Т.е. они не создаются динамически, а просто рисуются рукой. Поэтому дополнить инфой не получиться :(

значит ручками придеться. ну ладно.

Яски 26.06.2009 00:40

Есть значит объекты, а что с ними надо сделать?

Barzometr 26.06.2009 00:45

я хочу их сделать 3д.
"вытянуть" вверх, ну сделать 3д вообщем.
Юзаю движок Sandy 3d.

простые объекты получилось сделать 3д, там просто координаты взял, длину, ширину - все данные легко получить.

А вот со сложными объектами, не получается :(.

Яски 26.06.2009 21:20

Лучше иметь все таки объекты, описанные контурами. Тут недавно писали, что контур можно получить при помощи jsfl скрипта.

Barzometr 29.06.2009 11:15

Нашол скриптик, изменил под себя его. :) спс всем.


вот итог.

jsfl

Код AS3:

var elements = fl.getDocumentDOM().library.items;
FLfile.write("file:///C:/result.txt","");
for(var i = 0; i < elements.length; i++){
        flash.getDocumentDOM().library.editItem(elements[i].name);
    flash.getDocumentDOM().selectAll();
    var arrayContours = fl.getDocumentDOM().selection[0].contours;
        var numContours = arrayContours.length;
        var strTrace = "";
        while (numContours --) {
                var objContour = arrayContours[numContours];
                var objHalfEdge = objContour.getHalfEdge();
                var numStartID = objHalfEdge.id;
                var numID = 0;
 
                if (objContour.interior) {
                        continue;
                }
                while (numID != numStartID) {
                        var edge = objHalfEdge.getEdge();
                        var vertex = objHalfEdge.getVertex();
                        var numAnchorX = vertex.x;
                        var numAnchorY = vertex.y;
                        var numControlX = edge.getControl(1).x;
                        var numControlY = edge.getControl(1).y;
 
                        strTrace += "|" + numControlX + ", " + numControlY + ", " + numAnchorX + ", " + numAnchorY;
                        objHalfEdge = objHalfEdge.getNext();
                        numID = objHalfEdge.id;
                }
        }
        FLfile.write("file:///C:/result.txt", elements[i].name+strTrace+"\r\n","append");
}


что получается в файле
Код:

Symbol 3|49.95, 82.5, 49.95, 43|80.45, 43, 110.95, 43|110.95, 82.5, 110.95, 122|80.45, 122, 49.95, 122
Symbol 2|183.95, 157.75, 183.95, 137|227.45, 137, 270.95, 137|270.95, 172, 270.95, 207|239.7, 207, 208.45, 207|208.45, 219, 208.45, 231|182.2, 231, 155.95, 231|155.95, 204.75, 155.95, 178.5|169.95, 178.5, 183.95, 178.5
Symbol 1|355.95, 169.5, 355.95, 185|373.45, 185, 390.95, 185|390.95, 224.5, 390.95, 264|369.95, 264, 348.95, 264|348.95, 291, 348.95, 318|323.45, 318, 297.95, 318|297.95, 284, 297.95, 250|315.45, 250, 332.95, 250|332.95, 236, 332.95, 222|317.45, 222, 301.95, 222|301.95, 201, 301.95, 180|307.45, 180, 312.95, 180|312.95, 167, 312.95, 154|334.45, 154, 355.95, 154


Barzometr 29.06.2009 11:17

Вложений: 1
объекты

Партизан 29.06.2009 13:04

К вопросу о BitmapData....
Как-то возникала подобная задача у кого-то, только объекты могли быть разными... задача была разместить источник света и от объектов отбросить тень... В общем, если кому интересно - http://www.free-lance.ru/blogs/view....378777&ord=new

Barzometr 01.07.2009 12:55

какая-то невезуха :)

есть большая библиотека векторных объектов во флеш. Я специально для нее писал искал скрипт этот... Переделал под мою библеотку, чтоб по всей прошелся скрипт и все описал.
Вот, запустил. Все супер, работает, писал. Работал день. Потом нужно было выключить комп. Завершил аварийно работу флеша. Выключил, ушол. Потом прихожу, запускаю - а он мне выдает теперь ошибку

"TypeError: arrayContours has no properties"

блиин :) ну что ему нужно?

причем, я уже и на другом компе делаю новую флешку, запускаю скрипт - не катит :(.

как карму поправить? :)

Добавлено через 1 минуту
докопался в чем проблема - если убрать с объектов текстовые поля - тогда скрипт нормально обработает объект. НО! у меня раньше и с текстовыми полями работало нормально. Шрифты вроде не слетали :) да и я на другой даже машине запускал заново.. все равно пишет эту ошибку :(

Aerohd 01.07.2009 13:21

Вот тут посмотри http://labs.boulevart.be/index.php/2...ection-in-as3/. Я так понял тебе нужно описать объект для рассчета коллизий.

Barzometr 01.07.2009 17:53

Aerohd
спасибо, но немного не то :)


разобрался в проблеме

Код AS3:

var arrayContours = fl.getDocumentDOM().selection[fl.getDocumentDOM().selection.length-1].contours;

вот это исправит ошибку.

Просто если в выделении существует еще и текстовое поле, тогда слоев selection получается больше.


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

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