2009-12-20 8 views
0

EDIT (для пояснения)
У меня есть векторное изображение с простым контуром, нерегулярным замкнутым многоугольником.
Мне нужно импортировать его во Flash таким образом, чтобы затем я мог программно получить доступ к каждому из сегментов, которые образуют многоугольник.
Импорт векторного изображения в библиотеку как MovieClip не был хорошим, потому что все, что я получаю, это форма, из которой я вообще не могу получить геометрию.
Моя цель - вычислить площадь многоугольника, а также вычислить пересечение между многоугольником и другим полигоном.
Я думаю, я мог бы написать сценарий Illustrator, который читает все сегменты и записывает CSV-файлы с их координатами, но должен быть более простой способ, я имею в виду, они оба являются векторными, они должны понимать друг друга.ActionScript 3.0: Как получить доступ к сегментам Shape?

Спасибо!

.

- Old Post: -

У меня есть контур в векторной графике, что я ввезенная в библиотеке Flash-как мувиклип.
Я устанавливаю мувиклип, и у него есть дочерний элемент формы, который является фактическим контуром.
Мне нужно иметь возможность доступа к контурным сегментам, то есть к сторонам многоугольника, чтобы получить их начальную и конечную точки, есть ли способ?
Класс Graphics позволяет рисовать, но то, что вы рисуете, как и класс Shape, не является объектом, это не многоугольник со сторонами или что-то еще.
Я проясняю? Спасибо

+0

Немного неясно - пожалуйста, перефразируйте. –

ответ

2

Невозможно прочитать данные объекта Graphics (который, по существу, содержит информацию, которая вам нужна.) Это относится к любому векторному графическому объекту, который уже был нарисован либо с помощью API графики/рисунка или в Flash CS3/CS4, или был встроен с помощью метатега [Embed].

Ваш лучший выбор, если вам нужно вычислить алгебраическую область или по какой-либо другой причине сохранить векторы в ваших алгоритмах, определенно экспортирует SVG или какой-то одноцелевой формат (например, CSV точек) из Illustrator, и разбор этого в ActionScript.

Другой вариант - использовать BitmapData и нарисовать объект Shape на него, а затем подсчитать цветные (непрозрачные) пиксели для численного вычисления его области.

var bmp : BitmapData = new BitmapData(myShape.width, myShape.height, true, 0); 
bmp.draw(myShape); 

var i : uint; 
var area : uint = 0; 
var num_pixels : uint = bmp.width*bmp.height; 
for (i=0; i<num_pixels; i++) { 

    var px : uint = bmp.getPixel32(i%bmp.width, Math.floor(i/bmp.height)); 

    // Determine from px color/alpha whether it's part of the shape or not. 
    // This particular if statement should determine whether the alpha 
    // component (first 8 bits of the px integer) are greater than zero, i.e. 
    // not transparent. 
    if ((px >> 24) > 0) 
    area++; 
} 

trace('number of opaque pixels (area): '+area); 

В зависимости от вашего приложения, вы можете также быть в состоянии использовать метод BitmapData.hitTest() для обнаружения столкновений.

+0

вот путь ... Я думаю, что SVG - самый элегантный способ пойти, если вы действительно хотите работать с векторными данными (рассчитать пересечения линий/кривых и т. Д.) ...есть ряд библиотек SVG для разбора и рендеринга ... – back2dos

+0

Спасибо! отличный ответ. Я думаю, я поеду с иллюстратор сценарий, который экспортирует сегменты в CSV или что-то в этом роде. Я уже думал о очень простом алгоритме для разбиения многоугольника на треугольники и добавления всех их областей. Или есть лучший способ? Еще раз спасибо. – Petruza

+0

Отлично, получайте удовольствие! :) Что касается области, существуют обобщенные алгоритмы для области полигона на википеде: http://en.wikipedia.org/wiki/Polygon#Area_and_centroid – richardolsson

1

Я считаю, что лучшее, что вы можете сделать, это получить прямоугольную ограничительную рамку на объекте Shape. В зависимости от того, как вы импортировали его, вы можете иметь или не иметь прямой доступ к объекту Shape в качестве переменной экземпляра; однако, если вы это сделаете, вы можете вызвать shapeVar.transform.getBounds() или shapeVar.transform.getRect() (bounds возвращает прямоугольник, включающий штрихи на фигуре, rect не).

Мне любопытно, поэтому я занимаюсь изучением альтернативных способов получения некоторых границ пикселей. Я отредактирую это дальше, если найду что-нибудь полезное.

Смежные вопросы