| | |
| |
|
Основи на 2D графика во Java |
ГЕОМЕТРИЈА ВО JAVA – Shapes & Paths
Едни од основните операции на Graphics2D класата се пополнување на облици и исцртување на нивните надворешните линии. Оваа класа незнае многу за геометријата. Всушност со неа може да се исцрта само една работа а тоа е java.awt.Shape. Shape интерфејсот ги претставува само геометриските облици а со Graphics2D може да се исцртаат облиците (поточно границите на облиците) користејќи ја методата draw() и да се пополни нивната внатрешност со fill().
Java.awt.geom пакетот содржи корисни класи кои го имплементираат Shape интерфејсот. Постојат класи со кои се претставуваат елипси, криви, правоаголници и линии.
Java.awt.Shape
Овој интерфејс содржи четири групи на методи: getBounds(), contains(), intersects() и getPathIterator().
getBounds() методите враќаат правоаголници кои комплетно ги затвораат облиците.
public abstract Rectangle getBounds() – враќа java.awt.Rectangle кој комплетно го затвора обликот. Rectangle своите координати ги зачувува како int вредност.
public abstract Rectangle getBounds2D() – аналогно на претходното со тоа што се постигнува поголема прецизност т.е. координатите се чуваат како double. Ова метода како вредност враќа java.awt.geom.Rectangle2D.
слика: граници на форми
Секој облик има внатрешен и надворешен дел. Дали една точка или пак правоаголник комплетно се сместени во внатрешниот дел од обликот се проверува со методите:
public abstract boolean contains(double x, double y)
public abstract boolean contains(Point2D p)
public abstract boolean contains(double x, double y, double m, double n)
public abstract boolean contains(Rectangle2D r)
Наредниве методи проверуваат дали некој дел од правоаголникот поминува низ внатрешноста од обликот:
public abstract boolean intersects(double x, double y, double m, double n)
public abstract boolean intersects(Rectangle2D r)
Со методот getPathIterator() обликот претставен со Shape може да опише сопствена контура. Овој метод враќа објект од тип PathIterator.
Директно или индиректно секоја геометриска класа во java 2D го имплементира интерфејсот Shape. Ова значи дека сите тие можат да бидат пратени до методите на Graphics2D, draw() и paint().
Java.awt.geom.PathIterator
Значи граница на некој облик од тип Shape е претставена со патека. Патека претставува едноставна серија на инструкции од тип: оди до 0,0 или пак исцртај линија до 65,15. Во java 2D, сегментите од патеката се енкапсулирани во java.awt.geom.PathIterator интерфејсот. Со методот getPathIterator() на класата Shape може да вратиме објект кој ја опишува контурата на обликот. Тука треба да се напомене дека PathIterator е read-only, ја опишува патеката но не дозволува таа да биде променета.
PathIterator интерфејсот дефинира константи кои ги претставуваат петте можни сегментни типови:
public static final int SEG_MOVETO – ја обновува локацијата на патеката (path).
public static final int SEG_LINETO – црта права линија од последната точка на патеката.
public static final int SEG_QUADTO – овој сегментен тип е крива линија од втор ред која е опишана со две крајни точки и една контролна кои ги определуваат тангентите на кривата.
слика: криви од втор ред т.е. квадратни криви
слика: крајни точки, контролни точки, тангенти на квадратни криви
public static final int SEG_CUBICTO – овој сегментен тип ги претставува купичните криви, т.е. кривите од трет ред. Во принцип слични се со квадратните криви со таа разлика што кубичните имаат уште една контролна точка.
public static final int SEG_CLOSE – црта линија назад кон почетната точка од патеката.
Овде треба да ги спомнеме двата метода на класата PathIterator кои овозможуваат изминување на патеката и тестирање дали е достигнат крајот: public abstract void next() и public abstract boolean isDone().
Кај едноставните облици лесно се определува кој е внатрешен а кој надворешен дел. Меѓутоа кај покомплицираните тоа и не е така едноставно.
public static final int WIND_EVEN_ODD – го определува т.н. winding rule. Ова функционира т.ш цртаме линија преку целиот облик при што при секојпат кога линијата ќе пресече граница од обликот се зголемува бројачот. Кога бројачот е парен линијата е надвор од обликот, во спротивно е внатре.
слика: even-odd winding rule
public static final int WIND_NON_ZERO – оваа константа го претставува non-zero winding rule. И оваа правило функционира на принцип на исцртување на линија преку обликот. Овде е важен правецот на работ. При поминување преку раб кој е исцртан од лево кон десно се додава +1 а при преминување на раб исцртан од десно кон лево се одзема -1. Деловите од линијата каде акумулираниот збир е различен од нула се сметаат за внатрешност на обликот.
слика: non-zero winding rule
public abstract int getWindingRule() – го враќа winding rule за оваа (this) патека.
|
|
|
|
|
|
| |
|
|
---|
JavaTM и Java-базираните ознаки се трговски марки или регистрирани трговски марки на Sun Microsystems, Inc. во САД и други држави. Java.com.mk никако не соработува со Sun Microsystems, Inc. Сите други трговски марки се сопственост на нивните сопственици. |
|