<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7470289436282357198</id><updated>2024-09-14T19:23:55.163+03:00</updated><category term="java"/><category term="effective java"/><category term="general programming"/><category term="eclipse"/><category term="математика"/><category term="многопоточность"/><title type='text'>Coding Break</title><subtitle type='html'>Актуальный адрес: TheWonderBird.com</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codingbreak.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://codingbreak.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Сергей</name><uri>http://www.blogger.com/profile/06072560179480119743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7470289436282357198.post-3909477849255419784</id><published>2013-07-18T22:11:00.000+04:00</published><updated>2014-08-26T03:04:29.468+04:00</updated><title type='text'>Переезд блога</title><content type='html'>Привет!&lt;br /&gt;
&lt;br /&gt;
Я возобновил блог по новому адресу:&amp;nbsp;&lt;a href=&quot;http://thewonderbird.com/&quot;&gt;thewonderbird.com&lt;/a&gt;&lt;br /&gt;
Лента:&amp;nbsp;&lt;a href=&quot;http://thewonderbird.com/wp/feed/&quot;&gt;http://thewonderbird.com/wp/feed/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Присоединяйтесь!</content><link rel='replies' type='application/atom+xml' href='http://codingbreak.blogspot.com/feeds/3909477849255419784/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://codingbreak.blogspot.com/2013/07/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/3909477849255419784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/3909477849255419784'/><link rel='alternate' type='text/html' href='http://codingbreak.blogspot.com/2013/07/blog-post.html' title='Переезд блога'/><author><name>Сергей</name><uri>http://www.blogger.com/profile/06072560179480119743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7470289436282357198.post-2914708911130677283</id><published>2011-05-10T18:31:00.000+04:00</published><updated>2011-05-10T18:31:15.633+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="eclipse"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Не работает автодополнение в Eclipse</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;p&gt;Иногда случается, что какой-то воркспейс использовался с&amp;nbsp;одной версией Eclipse, потом стал использоваться с&amp;nbsp;другой версией Eclipse и&amp;nbsp;тут сломалось автодополнение (autocompletion) в Java. Решение в&amp;nbsp;таком случае очень простое&amp;nbsp;&amp;mdash; надо создать новый воркспейс и&amp;nbsp;импортировать туда проекты из&amp;nbsp;старого, при этом отметив &amp;laquo;Copy projects into workspace&amp;raquo;.&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingbreak.blogspot.com/feeds/2914708911130677283/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://codingbreak.blogspot.com/2011/05/eclipse.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/2914708911130677283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/2914708911130677283'/><link rel='alternate' type='text/html' href='http://codingbreak.blogspot.com/2011/05/eclipse.html' title='Не работает автодополнение в Eclipse'/><author><name>Сергей</name><uri>http://www.blogger.com/profile/06072560179480119743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7470289436282357198.post-2247218244775123285</id><published>2011-05-10T18:29:00.001+04:00</published><updated>2011-05-10T18:32:11.827+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="effective java"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="многопоточность"/><title type='text'>Effective Java: Concurrency</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;p&gt;Напоминаю, что данная серия постов&amp;nbsp;&amp;mdash; кратчайшее изложение основных мыслей книги &lt;a href=&quot;http://java.sun.com/docs/books/effective/&quot;&gt;Effective Java 2nd edition&lt;/a&gt;. Они не&amp;nbsp;заменят книги, но&amp;nbsp;помогут освежить кое-что в&amp;nbsp;памяти.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item&amp;nbsp;66. Синхронизируйте доступ к&amp;nbsp;общим (shared) изменяемым (mutable) данным.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Параграф о&amp;nbsp;применении ключевых слов &lt;code&gt;synchronized&lt;/code&gt; и &lt;code&gt;volatile&lt;/code&gt;. Автор делает следующие выводы: лучше всего избегать межпоточной синхронизации использованием immutable объектов. Если это невозможно, всегда нужна синхронизация, иначе результат работы программы будет непредсказуем. В&amp;nbsp;случаях, когда блокировки (ключевое слово &lt;code&gt;synchronized&lt;/code&gt;) не&amp;nbsp;нужны, допустимо использовать &lt;code&gt;volatile&lt;/code&gt;. Но&amp;nbsp;и&amp;nbsp;с&amp;nbsp;ним не&amp;nbsp;всё так просто&amp;nbsp;&amp;mdash; надо помнить, что не&amp;nbsp;все операции атомарны (&lt;code&gt;++&lt;/code&gt; и &lt;code&gt;--&lt;/code&gt; не&amp;nbsp;атомарны, операции чтения и&amp;nbsp;записи для &lt;code&gt;long&lt;/code&gt; и &lt;code&gt;double&lt;/code&gt; тоже).&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item&amp;nbsp;67. Избегайте избыточной синхронизации.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Никогда не&amp;nbsp;запускайте &amp;laquo;чужой&amp;raquo; (alien) код внутри синхронизированных блоков. &amp;laquo;Чужим&amp;raquo; называется код, предоставляемый клиентом вашего API. Соответственно, вы&amp;nbsp;не&amp;nbsp;знаете, что и&amp;nbsp;как будет выполняться в&amp;nbsp;этом коде, поэтому в&amp;nbsp;некоторых случаях выполнение &amp;laquo;чужого&amp;raquo; кода может привести к&amp;nbsp;дедлокам (deadlocks), состоянию гонки (race condition) ошибкам выполнения. Автор приводит пример кода с&amp;nbsp;такой проблемой. Выполнение &amp;laquo;чужого&amp;raquo; кода нужно выносить за&amp;nbsp;пределы &lt;code&gt;synchronized&lt;/code&gt;-блоков. Если это невозможно, синхронизацию следует переложить на&amp;nbsp;клиентский код, при этом явно задокументировав потоковую небезопасность вашего API.&lt;/p&gt;&lt;p&gt;Вообще, синхронизация дорога во&amp;nbsp;многих отношениях, поэтому внутри синхронизованных блоков нужно выполнять как можно меньше действий, по&amp;nbsp;возможности вынося все долгие операции наружу.&lt;/p&gt;&lt;p&gt;Если ваш класс не&amp;nbsp;предполагает обязательной многопоточности, лучше вообще ничего не&amp;nbsp;синхронизовывать&amp;nbsp;&amp;mdash; пусть лучше клиент об&amp;nbsp;этом заботится. Это правило нарушено во&amp;nbsp;многих старых стандартных классах, например, в &lt;code&gt;StringBuffer&lt;/code&gt;. Он&amp;nbsp;синхронизован внутри, хотя чаще всего использовался в&amp;nbsp;одном потоке. Поэтому пришлось создавать его несихронизованный аналог &lt;code&gt;StringBuilder&lt;/code&gt;, которым мы&amp;nbsp;почти всегда и&amp;nbsp;пользуемся.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item&amp;nbsp;68. Предпочитайте executors и&amp;nbsp;tasks вместо &amp;laquo;сырых&amp;raquo; потоков.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;В&amp;nbsp;Java&amp;nbsp;1.5 появился пакет &lt;code&gt;java.util.concurrent&lt;/code&gt;, содержащий Executor Framework. Данный фреймворк предоставляет классы, упрощающие выполнение очередей задач в&amp;nbsp;однопоточном, многопоточном режимах или по&amp;nbsp;таймеру. Благодаря им&amp;nbsp;больше не&amp;nbsp;нужно писать свои собственные безопасные очереди и&amp;nbsp;диспетчеры потоков.&lt;/p&gt;&lt;p&gt;Кроме того, фреймворк вводит понятие задач (tasks), представленных двумя интерфейсами &lt;code&gt;Runnable&lt;/code&gt; и &lt;code&gt;Callable&lt;/code&gt;. Эти интерфейсы позволяют абстрагироваться от&amp;nbsp;потоков и&amp;nbsp;не&amp;nbsp;работать с&amp;nbsp;ними напрямую.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item&amp;nbsp;69. Предпочитайте готовые многопоточные утилиты вместо &lt;code&gt;wait&lt;/code&gt; и &lt;code&gt;notify&lt;/code&gt;.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Пакет &lt;code&gt;java.util.concurrent&lt;/code&gt; кроме Executor Framework содержит ещё и&amp;nbsp;потокобезопасные коллекции и&amp;nbsp;синхронизаторы (synchronizers). Данный параграф рассказывает о&amp;nbsp;двух последних.&lt;/p&gt;&lt;p&gt;Потокобезопасные коллекции&amp;nbsp;&amp;mdash; высокоэффективные имплементации стандартных интерфейсов &lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Queue&lt;/code&gt;, &lt;code&gt;Map&lt;/code&gt;, &lt;code&gt;Set&lt;/code&gt;. Они синхронизованны внутри. Некоторые из&amp;nbsp;них имеют особые методы типа &lt;code&gt;map.putIfAbsent(key, value)&lt;/code&gt; для обеспечения атомарности подобных операций. Эти коллекции рекомендуется использовать вместо устаревших &lt;code&gt;Collections.synchronized&lt;i&gt;XXX&lt;/i&gt;&lt;/code&gt;, поскольку первые более производительны.&lt;/p&gt;&lt;p&gt;Синхронизаторы&amp;nbsp;&amp;mdash; объекты, заставляющие потоки ждать друг друга, прежде, чем начать выполнение. Наиболее часто используемые: &lt;code&gt;CountDownLatch&lt;/code&gt;, &lt;code&gt;Semaphore&lt;/code&gt;. Наименее используемые: &lt;code&gt;CyclicBarrier&lt;/code&gt;, &lt;code&gt;Exchanger&lt;/code&gt;. Про них по-хорошему нужно читать в&amp;nbsp;специализированных статьях и&amp;nbsp;книгах.&lt;/p&gt;&lt;p&gt;Причин использовать &lt;code&gt;wait&lt;/code&gt; и &lt;code&gt;notify&lt;/code&gt; в&amp;nbsp;новом коде крайне мало. Если приходится поддерживать старый код, использующий эти методы, нужно помнить, что &lt;code&gt;wait()&lt;/code&gt; всегда должен располагаться в&amp;nbsp;цикле while с&amp;nbsp;проверкой условия пробуждения.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item&amp;nbsp;70. Документируйте потокобезопасность.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;При настройках по&amp;nbsp;умолчанию Javadoc не&amp;nbsp;включает ключевые слова &lt;code&gt;synchronized&lt;/code&gt; в&amp;nbsp;документацию, и&amp;nbsp;правильно делает. Потокобезопасность нужно документировать самостоятельно. Существует 5&amp;nbsp;уровней потокобезопасности:&lt;ul&gt;&lt;li&gt;Неизменяемые (immutable) классы&amp;nbsp;&amp;mdash; синхронизация не&amp;nbsp;нужна. Примеры&amp;nbsp;&amp;mdash; &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Long&lt;/code&gt;, &lt;code&gt;BigInteger&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Безусловно потокобезопасные классы&amp;nbsp;&amp;mdash; экземпляры класса изменяемы, но&amp;nbsp;синхронизованны внутри, и&amp;nbsp;внешняя синхронизация не&amp;nbsp;требуется. Примеры&amp;nbsp;&amp;mdash; &lt;code&gt;Random&lt;/code&gt;, &lt;code&gt;ConcurrentHashMap&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Условно потокобезопасные классы&amp;nbsp;&amp;mdash; некоторые методы требуют внешней синхронизации. Например, врапперы &lt;code&gt;Collections.synchronized&lt;i&gt;XXX&lt;/i&gt;&lt;/code&gt; - их&amp;nbsp;итераторы требуют дополнительной синхронизации.&lt;/li&gt;
&lt;li&gt;Не&amp;nbsp;потокобезопасные классы&amp;nbsp;&amp;mdash; их&amp;nbsp;экземпляры изменяемы, нужна внешняя синхронизация. Пример&amp;nbsp;&amp;mdash; коллекции из &lt;code&gt;java.util&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Враждебные многопоточности (thread-hostile) классы, методы&amp;nbsp;&amp;mdash; им&amp;nbsp;не&amp;nbsp;помогает даже внешная синхронизация. В&amp;nbsp;основном, это происходит, когда экземпляры работают со&amp;nbsp;статическими данными класса. Такие классы&amp;nbsp;&amp;mdash; редкость, они появляются, если кто-то не&amp;nbsp;расчитывает на&amp;nbsp;многопоточность при проектировании.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item&amp;nbsp;71. Используйте ленивую инициализацию с&amp;nbsp;умом.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Параграф описывает способы осуществления ленивой инициализации. Если не&amp;nbsp;позаботиться о&amp;nbsp;многопоточности, может случаться повторная инициализация.&lt;/p&gt;&lt;p&gt;Когда нужно лениво инциализировать статическое поле, используйте holder class idiom; когда не&amp;nbsp;статическое поле&amp;nbsp;&amp;mdash; double-check idiom. И&amp;nbsp;помните, что оптимизировать нужно только тогда, когда это действительно необходимо.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item&amp;nbsp;72. Не&amp;nbsp;полагайтесь на&amp;nbsp;планировщик потоков.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Код, полагающийся в&amp;nbsp;своей корректности или производительности на&amp;nbsp;алгоритм планировщика потоков, не&amp;nbsp;переносим. Количество работающих (runnable) потоков не&amp;nbsp;должно значительно превышать количество процессоров. Потоки не&amp;nbsp;должны работать, если они не&amp;nbsp;делают никакой полезной работы. Нужно избегать использования &lt;code&gt;Thread.yield()&lt;/code&gt; - если производительность низкая, лучше реорганизовать рабочие потоки. Приоритеты потоков допустимо использовать, чтобы немного подрегулировать перфоманс, однако на&amp;nbsp;них нельзя полагаться при решении более серьёзных проблем с&amp;nbsp;многопоточностью. Они тоже реализованы по-разному в&amp;nbsp;разных JVM, некоторые виртуальные машины могут попросту их&amp;nbsp;игнорировать.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item&amp;nbsp;73. Избегайте использования групп потоков (thread groups).&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Группы потоков были придуманы с&amp;nbsp;целью изолировать java-апплеты для безопасности, но&amp;nbsp;они так и&amp;nbsp;не&amp;nbsp;справились с&amp;nbsp;этим. Сейчас этот API совершенно устарел. Нет причин использовать его в&amp;nbsp;коде.&lt;/p&gt;&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingbreak.blogspot.com/feeds/2247218244775123285/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://codingbreak.blogspot.com/2011/05/effective-java-concurrency.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/2247218244775123285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/2247218244775123285'/><link rel='alternate' type='text/html' href='http://codingbreak.blogspot.com/2011/05/effective-java-concurrency.html' title='Effective Java: Concurrency'/><author><name>Сергей</name><uri>http://www.blogger.com/profile/06072560179480119743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7470289436282357198.post-6498004365902175477</id><published>2011-04-02T19:58:00.000+04:00</published><updated>2011-04-02T19:58:28.100+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="effective java"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Effective Java: Exceptions</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;p&gt;Продолжаем. Сегодня речь о 9-й главе &amp;laquo;Exceptions&amp;raquo;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item 57. Используйте exception-ы только для исключительных (exceptional) ситуаций.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Автор приводит пример применения исключений не по назначению для итерации по массиву без проверки выходна за границу.&lt;/p&gt;&lt;pre style=&#39;color:#000000;background:#ffffff;&#39;&gt;&lt;span style=&#39;color:#696969; &#39;&gt;// Horrible abuse of exceptions. Don&#39;t ever do this!&lt;/span&gt;
try &lt;span style=&#39;color:#800080; &#39;&gt;{&lt;/span&gt;
    &lt;span style=&#39;color:#bb7977; &#39;&gt;int&lt;/span&gt; i &lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#008c00; &#39;&gt;0&lt;/span&gt;&lt;span style=&#39;color:#800080; &#39;&gt;;&lt;/span&gt;
    &lt;span style=&#39;color:#800000; font-weight:bold; &#39;&gt;while&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#800000; font-weight:bold; &#39;&gt;true&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;
        range&lt;span style=&#39;color:#808030; &#39;&gt;[&lt;/span&gt;i&lt;span style=&#39;color:#808030; &#39;&gt;+&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;+&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;]&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;climb&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;&lt;span style=&#39;color:#800080; &#39;&gt;;&lt;/span&gt;
&lt;span style=&#39;color:#800080; &#39;&gt;}&lt;/span&gt; catch(ArrayIndexOutOfBoundsException e) &lt;span style=&#39;color:#800080; &#39;&gt;{&lt;/span&gt;
&lt;span style=&#39;color:#800080; &#39;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Такой подход может ошибочно применятся для ускорения программы, однако имеет большое число недостатков. В их числе - плохое влияние на действительную производительность.&lt;/p&gt;&lt;p&gt;Мораль такова: exception-ы не случайно названы именно так и должны использоваться только для обработки исключительных ситуаций, а не для контроля за нормальным выполнением программы.&lt;/p&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item 58. Используйте проверяемые исключения (checked exceptions) в поправимых ситуациях и непроверяемые исключения (runtime exceptions) при программных ошибках.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Основная идея заложена в названии. Правда, зачастую невозможно точно определить, к какому типу исключения относится та или иная ситуация - в этом случае нужно выбирать наиболее подходящий вариант. Кроме того, полезно помнить:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Принято считать, что класс &lt;code&gt;Error&lt;/code&gt; и его подклассы используются только виртуальной машиной, и наследоваться от них не надо - вместо этого использовать &lt;code&gt;RuntimeException&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Не имеет смысла напрямую имплементировать &lt;code&gt;Throwable&lt;/code&gt;, не наследуясь от какого-либо &lt;code&gt;Exception&lt;/code&gt;-а. Поведение будет такое же, как и у checked exceptions.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Exception&lt;/code&gt;-ы - полноценные объекты, для которых можно и нужно объявлять дополнительные методы, предоставляющие информацию об исключении.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item 59. Избегайте лишних проверяемых исключений (checked exceptions).&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Злоупотребление проверяемыми исключениями приводит к неудобствам при использовании вашего API. Если исключение можно предотвратить проверкой специальных условий (как метод &lt;code&gt;hasNext()&lt;/code&gt; класса &lt;code&gt;Iterator&lt;/code&gt;), либо клиент не сможет предпринять никаких полезных действий при возникновении исключения, то использование runtime exception - наилучший выбор.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item 60. Предпочитайте стандартные классы-исключения.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Применение стандартных исключений полезно хотя бы потому, что все их знают, и использование вашего API будет таким образом упрощено. Самые часто применяемые исключения из стандартной библиотеки: &lt;code&gt;IllegalArgumentException&lt;/code&gt;, &lt;code&gt;IllegalStateException&lt;/code&gt;, &lt;code&gt;NullPointerException&lt;/code&gt;, &lt;code&gt;IndexOutOfBoundsException&lt;/code&gt;, &lt;code&gt;ConcurrentModificationException&lt;/code&gt;, &lt;code&gt;UnsupportedOperationException&lt;/code&gt;. Важно не забывать, что exception должен соответствовать исключительной ситуации не только по названию, но и по семантике, описанной в документации к исключению. Также бывает полезно наследоваться от стандартных исключений для добавления в них какой-либо полезной информации.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item 61. Кидайте исключения, соответствующие уровню абстракции.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Классы высокого уровня должны перехватывать низкоуровневые исключения и заменять их более подходящими для текущей абстракции:&lt;/p&gt;&lt;pre style=&#39;color:#000000;background:#ffffff;&#39;&gt;&lt;span style=&#39;color:#3f5fbf; &#39;&gt;/**&lt;/span&gt;
&lt;span style=&#39;color:#3f5fbf; &#39;&gt;&amp;#xa0;&lt;/span&gt;&lt;span style=&#39;color:#7f9fbf; font-weight:bold; &#39;&gt;*&lt;/span&gt;&lt;span style=&#39;color:#3f5fbf; &#39;&gt; Returns the element at the specified position in this list.&lt;/span&gt;
&lt;span style=&#39;color:#3f5fbf; &#39;&gt;&amp;#xa0;&lt;/span&gt;&lt;span style=&#39;color:#7f9fbf; font-weight:bold; &#39;&gt;*&lt;/span&gt;&lt;span style=&#39;color:#3f5fbf; &#39;&gt; &lt;/span&gt;&lt;span style=&#39;color:#7f9fbf; font-weight:bold; &#39;&gt;@throws&lt;/span&gt;&lt;span style=&#39;color:#3f5fbf; &#39;&gt; IndexOutOfBoundsException if the index is out of range&lt;/span&gt;
&lt;span style=&#39;color:#3f5fbf; &#39;&gt;&amp;#xa0;&lt;/span&gt;&lt;span style=&#39;color:#7f9fbf; font-weight:bold; &#39;&gt;*&lt;/span&gt;&lt;span style=&#39;color:#3f5fbf; &#39;&gt; ({&lt;/span&gt;&lt;span style=&#39;color:#7f9fbf; font-weight:bold; &#39;&gt;@&lt;/span&gt;&lt;span style=&#39;color:#3f5fbf; &#39;&gt;code index &amp;lt; &lt;/span&gt;&lt;span style=&#39;color:#008c00; &#39;&gt;0&lt;/span&gt;&lt;span style=&#39;color:#3f5fbf; &#39;&gt; || index &gt;= size()}).&lt;/span&gt;
&lt;span style=&#39;color:#3f5fbf; &#39;&gt;&amp;#xa0;*/&lt;/span&gt;
&lt;span style=&#39;color:#800000; font-weight:bold; &#39;&gt;public&lt;/span&gt; E get(int index) &lt;span style=&#39;color:#800080; &#39;&gt;{&lt;/span&gt;
    ListIterator&lt;span style=&#39;color:#808030; &#39;&gt;&amp;lt;&lt;/span&gt;E&lt;span style=&#39;color:#808030; &#39;&gt;&gt;&lt;/span&gt; i &lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt; listIterator&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;index&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;&lt;span style=&#39;color:#800080; &#39;&gt;;&lt;/span&gt;
    &lt;span style=&#39;color:#800000; font-weight:bold; &#39;&gt;try&lt;/span&gt; &lt;span style=&#39;color:#800080; &#39;&gt;{&lt;/span&gt;
        &lt;span style=&#39;color:#800000; font-weight:bold; &#39;&gt;return&lt;/span&gt; i&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;next&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;&lt;span style=&#39;color:#800080; &#39;&gt;;&lt;/span&gt;
    &lt;span style=&#39;color:#800080; &#39;&gt;}&lt;/span&gt; &lt;span style=&#39;color:#800000; font-weight:bold; &#39;&gt;catch&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#bb7977; font-weight:bold; &#39;&gt;NoSuchElementException&lt;/span&gt; e&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt; &lt;span style=&#39;color:#800080; &#39;&gt;{&lt;/span&gt;
        &lt;span style=&#39;color:#800000; font-weight:bold; &#39;&gt;throw&lt;/span&gt; &lt;span style=&#39;color:#800000; font-weight:bold; &#39;&gt;new&lt;/span&gt; &lt;span style=&#39;color:#bb7977; font-weight:bold; &#39;&gt;IndexOutOfBoundsException&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;&quot;Index: &quot;&lt;/span&gt; &lt;span style=&#39;color:#808030; &#39;&gt;+&lt;/span&gt; index&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;&lt;span style=&#39;color:#800080; &#39;&gt;;&lt;/span&gt;
    &lt;span style=&#39;color:#800080; &#39;&gt;}&lt;/span&gt;
&lt;span style=&#39;color:#800080; &#39;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Это называется exception translation idiom. Особая её форма - exception chaining - когда низкоуровневое исключение не отбрасывается, а сохраняется в поле cause высокоуровнего исключения:&lt;/p&gt;&lt;pre style=&#39;color:#000000;background:#ffffff;&#39;&gt;&lt;span style=&#39;color:#696969; &#39;&gt;// Exception Chaining&lt;/span&gt;
try &lt;span style=&#39;color:#800080; &#39;&gt;{&lt;/span&gt;
    &lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt; &lt;span style=&#39;color:#696969; &#39;&gt;// Use lower-level abstraction to do our bidding&lt;/span&gt;
&lt;span style=&#39;color:#800080; &#39;&gt;}&lt;/span&gt; catch (LowerLevelException cause) &lt;span style=&#39;color:#800080; &#39;&gt;{&lt;/span&gt;
    &lt;span style=&#39;color:#800000; font-weight:bold; &#39;&gt;throw&lt;/span&gt; &lt;span style=&#39;color:#800000; font-weight:bold; &#39;&gt;new&lt;/span&gt; HigherLevelException&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;cause&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;&lt;span style=&#39;color:#800080; &#39;&gt;;&lt;/span&gt;
&lt;span style=&#39;color:#800080; &#39;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;В этом случае стек трейсы исключений будут выводиться в сцепленном виде. Это является, в некотором роде, нарушением инкапсуляции, поэтому злоупотреблять не стоит.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item 62. Документируйте кидаемые исключения.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Под документированием исключений понимается их пораздельное объявление с точным описанием условий возникновения.&lt;/p&gt;&lt;p&gt;Описывайте каждое проверяемое исключение (checked exception), которое может быть кинуто из ваших методов, используйте для этого javadoc-тег &lt;code&gt;@throws&lt;/code&gt;. Непроверяемые исключения тоже важно упоминать в документации, но не с тегом &lt;code&gt;@throws&lt;/code&gt;, а просто в описании метода. Конечно, описать всевозможные runtime exceptions далеко не всегда представляется возможным. Всё это относится как к конкретным методам, так и к абстрактным и методам в интерфейсах.&lt;/p&gt;&lt;p&gt;Если одно и то же исключение кидается многими методами одного класса или интерфейса при одинаковых условиях, допустимо описать его в документации самого класса или интерфейса.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item 63. Включайте в исключения информацию об ошибках.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Когда программа падает с непроверяемым исключением, stack trace и текстовое сообщение из исключения попадают в лог или консоль. Если ошибку трудно или невозможно воспроизвести, то эта вся информация, доступная разработчикам для поиска ошибки. Поэтому важно наделять текст исключения всеми важными значениями, касающимися исключительной ситуации. Проверяемые исключения полезно обеспечивать методами-аксессорами к этим значениям, которые могут пригодиться при обработке исключения в &lt;code&gt;catch&lt;/code&gt;-блоке.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item 64. Стремитесь к атомарности сбоев (failure atomicity).&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Любое задокументированное исключение, сгенерированное методом объекта, должно оставлять объект в рабочем состоянии - это и называется failure atomicity. Если добиться такого эффекта слишком сложно или невозможно, нужно ясно заявить об этом в документации.&lt;/p&gt;&lt;p&gt;Для неизменяемых (immutable) инстансов failure atomicity гарантирована по определению. Добиться её в остальных случаях можно одним из следующих способов (по убыванию популярности):&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;проверять входные параметры каждого метода до выполнения каких-либо действий;&lt;/li&gt;
&lt;li&gt;выполнять все &amp;laquo;опасные&amp;raquo; вычисления до изменения состояния объекта;&lt;/li&gt;
&lt;li&gt;писать восстанавливающий код для отката объекта в консистентное состояние;&lt;/li&gt;
&lt;li&gt;выполнять действия над временной копией объекта. Пример - метод &lt;code&gt;Collections.sort()&lt;/code&gt; копирует объекты из коллекции во временный массив (в т. ч. для лучшей скорости), сортирует их, затем копирует обратно.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Item 65. Не игнорируйте исключения.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Кажется, это очевидно. Исключения придуманы для того, чтобы заставить программиста учитывать их и выполнять какие-либо действия при их возникновении, а не игнорировать их. В самом крайнем случае, когда никакие действия и правда не нужны, необходимо в &lt;code&gt;catch&lt;/code&gt;-блоке написать комментарий, почему exception проигнорирован.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Впереди две последние главы - о многопоточности и сериализации. Не переключайте канал.&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingbreak.blogspot.com/feeds/6498004365902175477/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://codingbreak.blogspot.com/2011/04/effective-java-exceptions.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/6498004365902175477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/6498004365902175477'/><link rel='alternate' type='text/html' href='http://codingbreak.blogspot.com/2011/04/effective-java-exceptions.html' title='Effective Java: Exceptions'/><author><name>Сергей</name><uri>http://www.blogger.com/profile/06072560179480119743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7470289436282357198.post-7282150669859444567</id><published>2011-02-19T18:23:00.000+03:00</published><updated>2011-02-19T18:23:46.899+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="effective java"/><category scheme="http://www.blogger.com/atom/ns#" term="general programming"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Effective Java: General Programming (2/2)</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;
&lt;b&gt;Item 51. Конкатенация строк медленна.&lt;/b&gt;&lt;br /&gt;
Конкатенация (&quot;+&quot;) n строк выполняется за время n&lt;sup&gt;2&lt;/sup&gt; - следствие того, что строки в Java неизменяемы (immutable); когда соединяются две строки, содержимое обеих полностью копируется в новую. Поэтому если требуется объединить большое или заранее неизвестное количество строк, рекомендуется использовать &lt;code&gt;StringBuilder&lt;/code&gt; (есть ещё &lt;code&gt;StringBuffer&lt;/code&gt;, но он синхронизован, поэтому медленнее).&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 52. Ссылайтесь на объекты посредством их интерфейсов.&lt;/b&gt;&lt;br /&gt;
Если существует подходящий интерфейс, то лучше объявлять все параметры, возвращаемые значения, переменные и поля именно этим интерфейсом, а не имплементирующим классом.&lt;br /&gt;
Хорошо:&lt;br /&gt;
&lt;pre style=&#39;color:#000000;background:#ffffff;&#39;&gt;List&amp;lt;Subscriber&gt; subscribers = new Vector&amp;lt;Subscriber&gt;()&lt;span style=&#39;color:#808030; &#39;&gt;;&lt;/span&gt;
&lt;/pre&gt;Плохо:&lt;br /&gt;
&lt;pre style=&#39;color:#000000;background:#ffffff;&#39;&gt;Vector&amp;lt;Subscriber&gt; subscribers = new Vector&amp;lt;Subscriber&gt;()&lt;span style=&#39;color:#808030; &#39;&gt;;&lt;/span&gt;
&lt;/pre&gt;Это делает код более гибким, позволяет сменить имплементацию изменением всего одной строки. Исключения составляют те случаи, когда используются методы, специфичные для  имплементации, либо код полагается на некоторые особые свойства имплементации (например, потокобезопасность &lt;code&gt;Vector&lt;/code&gt;-а).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 53. Предпочитайте интерфейсы вместо reflection.&lt;/b&gt;&lt;br /&gt;
Суть в следующем: reflection - весьма небезопасная и малопроизводительная вещь, к тому же ещё и редко необходимая. Но если уж так случилось, что без неё никуда, то лучше хотя бы ограничить её использование. В большинстве программ, использующих недоступные в compile time классы, существует некоторый интерфейс или суперкласс, через которые можно ссылаться на экземпляры этого недоступного класса. То есть предлагается создавать экземпляры через reflection, а затем работать с ними через интерфейс или суперкласс, как с любыми другими объектами.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 54. Применяйте нативные (native) методы с умом.&lt;/b&gt;&lt;br /&gt;
Нативные методы имеют 3 основных назначения:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Обеспечение доступа к платформо-зависимым средствам.&lt;br /&gt;
В целом допустимо использовать нативные методы для этого, хотя Java платформа с каждой новой версией постепенно избавляет от такой необходимости.&lt;/li&gt;
&lt;li&gt;Возможность использовать устаревшие (legacy) библиотеки.&lt;br /&gt;
Тоже допустимо.&lt;/li&gt;
&lt;li&gt;Увеличение производительности приложения.&lt;br /&gt;
В старых версиях Java и JVM это имело смысл, сейчас - практически нет. Java стала &lt;i&gt;намного&lt;/i&gt; быстрее, большинство задач можно решить без нативных методов без значительных потерь в производительности.&lt;/li&gt;
&lt;/ol&gt;Использование нативных методов имеет много минусов: это небезопасно, платформо-зависимо и может даже &lt;i&gt;ухудшить&lt;/i&gt; производительность.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 55. Оптимизируйте с умом.&lt;/b&gt;&lt;br /&gt;
Преждевременная оптимизация - зло. Не нужно ничего оптимизировать, пока не получено правильное и надёжное, хоть и медленное, решение. Если программа хорошо спроектирована, отдельные модули можно будет оптимизировать позже, без изменений в других модулях.&lt;br /&gt;
И, конечно, когда действительно приходит время для оптимизации, нужно сначала выяснить (например, с помощью профайлера), в каком месте программа тратит больше всего времени. Народная мудрость: 80% времени программа проводит в 20% кода.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 56. Соблюдайте всеобщие соглашения о наименованиях (naming conventions).&lt;/b&gt;&lt;br /&gt;
Платформа Java имеет устоявшиеся принципы именования &lt;i&gt;всего&lt;/i&gt; (пакетов, классов, интерфейсов, методов, ...), большую часть которых можно найти в &lt;a href=&quot;http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.8&quot;&gt;Java Language Specification (6.8)&lt;/a&gt;. Рекомендуется их строго соблюдать и не нарушать без веской на то причины, иначе поддерживать ваш код и использовать его API будет затруднительно.&lt;br /&gt;
Данный параграф содержит эти принципы, переписывать частично или полностью смысла нет.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingbreak.blogspot.com/feeds/7282150669859444567/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://codingbreak.blogspot.com/2011/02/effective-java-general-programming-22.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/7282150669859444567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/7282150669859444567'/><link rel='alternate' type='text/html' href='http://codingbreak.blogspot.com/2011/02/effective-java-general-programming-22.html' title='Effective Java: General Programming (2/2)'/><author><name>Сергей</name><uri>http://www.blogger.com/profile/06072560179480119743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7470289436282357198.post-1138511532622505819</id><published>2011-01-19T21:39:00.000+03:00</published><updated>2011-01-19T21:39:12.435+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="effective java"/><category scheme="http://www.blogger.com/atom/ns#" term="general programming"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Effective Java: General Programming (1/2)</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Эта глава книги Effective Java собрала более общие советы по написанию кода на Java (и не только). Параграфов довольно много, поэтому я разбил свой сжатый пересказ на две части.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 45. Минимизируйте область видимости локальных переменных.&lt;/b&gt;&lt;br /&gt;
Это улучшает читабельность кода и уменьшает число потенциальных ошибок.&lt;br /&gt;
Прежде всего, по возможности объявлять локальную переменную надо там, где она впервые используется. Далее, почти все объявления локальных переменных должны содержать инициализацию. Исключение - когда инициализацию нужно поместить в &lt;code&gt;try/catch&lt;/code&gt; блок, а сама переменная нужна снаружи него.&lt;br /&gt;
Отдельно следует отметить циклы. Цикл &lt;code&gt;for&lt;/code&gt; предоставляет возможность объявлять переменные цикла (loop variables) доступными только для тела самого цикла, что делает его более предпочтительным, нежели циклы &lt;code&gt;while&lt;/code&gt;.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 46. Предпочитайте &lt;code&gt;for-each&lt;/code&gt; циклы вместо &lt;code&gt;for&lt;/code&gt;.&lt;/b&gt;&lt;br /&gt;
Опять же, это делает код более читабельным и уменьшает шансы ошибиться по невнимательности. Но есть и случаи, когда &lt;code&gt;for-each&lt;/code&gt; не подходит: фильтрация (когда нужно удалять элементы из коллекции, нужен явный итератор), трансформация (когда нужно заменять одни элементы списка или массива на другие, нужен явный итератор или переменная-индекс), параллельная итерация по нескольким коллекциям.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 47. Знайте и применяйте библиотеки.&lt;/b&gt;&lt;br /&gt;
Изобретать колёса не имеет смысл, потому что:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;это лишняя трата времени;&lt;/li&gt;
&lt;li&gt;вряд ли получится лучше, чем уже написано ранее;&lt;/li&gt;
&lt;li&gt;библиотеки совершенствуются без вашего участия.&lt;/li&gt;
&lt;/ul&gt;Полезно иногда смотреть в release notes новых версий библиотек.&lt;br /&gt;
Приведён хороший пример кривого колеса: самописная функция, возвращающая псевдослучайное число из интервала &lt;code&gt;[0, n)&lt;/code&gt;:&lt;br /&gt;
&lt;pre style=&#39;color:#000000;background:#ffffff;&#39;&gt;&lt;span style=&#39;color:#800000; font-weight:bold; &#39;&gt;static&lt;/span&gt; int random(int n) &lt;span style=&#39;color:#800080; &#39;&gt;{&lt;/span&gt;
    &lt;span style=&#39;color:#800000; font-weight:bold; &#39;&gt;return&lt;/span&gt; &lt;span style=&#39;color:#bb7977; font-weight:bold; &#39;&gt;Math&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;abs&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;rnd&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;nextInt&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt; &lt;span style=&#39;color:#808030; &#39;&gt;%&lt;/span&gt; n&lt;span style=&#39;color:#800080; &#39;&gt;;&lt;/span&gt;
&lt;span style=&#39;color:#800080; &#39;&gt;}&lt;/span&gt;
&lt;/pre&gt;Функция выглядит нормально, но в ней скрыты целых три изъяна. Предлагается попробовать поискать их самостоятельно, однако два их них весьма нетривиальны (я-то их сам точно не нашёл бы). Эти недостатки перечислены в конце поста.&lt;br /&gt;
Вместо такой функции следует использовать &lt;code&gt;Random.nextInt(int)&lt;/code&gt;, где этих проблем нет.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 48. Избегайте &lt;code&gt;float&lt;/code&gt; и &lt;code&gt;double&lt;/code&gt;, если нужны точные результаты.&lt;/b&gt;&lt;br /&gt;
Типы &lt;code&gt;float&lt;/code&gt; и &lt;code&gt;double&lt;/code&gt; представляют собой числа с плавающей запятой (floating point). Это означает, что они хранят не точное значение числа, а максимально близкое к нему приближение. Например, они не могут точно хранить числа &lt;code&gt;0.1&lt;/code&gt;, &lt;code&gt;0.01&lt;/code&gt;, &lt;code&gt;0.001&lt;/code&gt; и т.д. Если задача требует точных результатов, лучше использовать &lt;code&gt;BigDecimal&lt;/code&gt; (хоть они и менее удобны и быстры, чем примитивы), либо сводить эту задачу к целым числам (например, считать деньги не в рублях, а копейках).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 49. Предпочитайте примитивы вместо объектных типов.&lt;/b&gt;&lt;br /&gt;
&lt;small&gt;(здесь и далее под объектным типом подразумевается объектная обёртка примитива (boxed primitive))&lt;/small&gt;&lt;br /&gt;
Автобоксинг и автоанбоксинг (Java 1.5) размыл, но не стёр различия между ними. А различия таковы:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;у объектных типов могут существовать разные экземпляры с одинаковыми значениями, что не позволяет сравнивать их между собой с помощью &lt;code&gt;==&lt;/code&gt;, как примитивы;&lt;/li&gt;
&lt;li&gt;объектные типы допускают дополнительное нефункциональное значение &lt;code&gt;null&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;примитивы экономичнее в плане производительности и использования памяти.&lt;/li&gt;
&lt;/ul&gt;Когда следует применять объектные типы:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;при работе с коллекциями и другими параметризированными классами;&lt;/li&gt;
&lt;li&gt;при рефлексивном (reflective) вызове методов.&lt;/li&gt;
&lt;/ul&gt;В остальных случаях, когда есть выбор, рекомендуется применять примитивы. Если приходится иметь дело с объектными типами, следует помнить:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;если программа сравнивает объектные типы с помощью &lt;code&gt;==&lt;/code&gt;, то сравниваются ссылки на объекты, что почти всегда не то, что вы хотите;&lt;/li&gt;
&lt;li&gt;когда в выражении замешаны и примитивы, и объектные типы, выполняется unboxing последних;&lt;/li&gt;
&lt;li&gt;unboxing может вызвать &lt;code&gt;NullPointerException&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Item 50. Избегайте строк, если другие типы больше подходят.&lt;/b&gt;&lt;br /&gt;
Строки - не замена для других типов значений. Поступающая в программу информация, будь то чтение из файла, обмен по сети или ввод с клавиатуры, чаще всего приходит именно в текстовом виде и должна храниться в &lt;code&gt;String&lt;/code&gt; только если действительно представляет собой некоторый текст. Если же есть более подходящий тип для данных (числовые типы, &lt;code&gt;boolean&lt;/code&gt;, ...), нужно использовать его.&lt;br /&gt;
Строки - не замена для &lt;code&gt;enum&lt;/code&gt;-констант. Об этом было в Item 30.&lt;br /&gt;
Строки - не замена для составных типов. Так делать плохо:&lt;br /&gt;
&lt;pre style=&#39;color:#000000;background:#ffffff;&#39;&gt;String compoundKey = className + &quot;#&quot; + i.next()&lt;span style=&#39;color:#808030; &#39;&gt;;&lt;/span&gt;
&lt;/pre&gt;Для составных типов лучше писать составные классы.&lt;br /&gt;
Строки не годятся для предоставления доступа к чему-либо. Имеется в виду то, что, например, строки нехорошо использовать в качестве ключей доступа к определённым данным в том случае, если клиентский код может нарушить целостность этих данных, предоставив неправильный или &amp;laquo;чужой&amp;raquo; ключ.&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;&lt;br /&gt;
Далее спойлер (см. Item 47)&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
.&lt;br /&gt;
&lt;br /&gt;
Три изъяна функции из Item 47:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Если &lt;code&gt;rnd.nextInt()&lt;/code&gt; выдаст &lt;code&gt;Integer.MIN_VALUE&lt;/code&gt;, то функция вернёт отрицательное значение.&lt;/li&gt;
&lt;li&gt;Если &lt;code&gt;n&lt;/code&gt; - малая степень двойки, то последовательность генерируемых чисел довольное скоро начнёт повторять саму себя.&lt;/li&gt;
&lt;li&gt;Если &lt;code&gt;n&lt;/code&gt; - не степень двойки, то некоторые псевдослучайные числа будут генерироваться чаще других.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingbreak.blogspot.com/feeds/1138511532622505819/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://codingbreak.blogspot.com/2011/01/effective-java-general-programming-12.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/1138511532622505819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/1138511532622505819'/><link rel='alternate' type='text/html' href='http://codingbreak.blogspot.com/2011/01/effective-java-general-programming-12.html' title='Effective Java: General Programming (1/2)'/><author><name>Сергей</name><uri>http://www.blogger.com/profile/06072560179480119743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7470289436282357198.post-4222350872977807328</id><published>2010-12-14T00:29:00.002+03:00</published><updated>2011-01-19T21:49:27.972+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="effective java"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Effective Java: Методы</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Переходим к следующей главе книги.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 38. Проверяйте параметры на корректность.&lt;/b&gt;&lt;br /&gt;
Большинство методов и конструкторов имеют некоторые ограничения на передаваемые им параметры. Проверка корректности этих параметров позволяет обнаруживать проблемы как можно раньше, что облегчает её исправление.&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Для публичных методов и конструкторов лучше всего сразу проверять параметры и кидать соответствующие exception-ы, если они некорректны. Обычно это бывают &lt;code&gt;IllegalArgumentException&lt;/code&gt;, &lt;code&gt;IndexOutOfBoundsException&lt;/code&gt; или &lt;code&gt;NullPointerException&lt;/code&gt;. Ограничения на параметры и exception-ы, которые кидаются при их нарушении должны быть задокументированы.&lt;br /&gt;
Для неэкспортируемых (закрытых) методов и конструкторов вы, как автор пакета, сами отвечаете за корректность передаваемых параметров и должны использовать только assertions для их проверки.&lt;br /&gt;
Есть и исключения из этих правил. Одно из них - когда проверка корректности слишком сложна и затратна &lt;i&gt;и&lt;/i&gt; она происходит неявно во время выполнения метода. Пример такой ситуации - сортировка списка &lt;code&gt;Collections.sort(List)&lt;/code&gt;, который может содержать несравниваемые элементы. Иногда в таких случаях полезно применять идиому перевода исключений (exception translation idiom), чтобы клиентский код всегда получал понятное исключение вроде &lt;code&gt;IllegalArgumentException&lt;/code&gt; вместо того, которое порождается внутри закрытого кода.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 39. Делайте защитные копии (defensive copies), когда нужно.&lt;/b&gt;&lt;br /&gt;
Здесь название говорит сам за себя. Вообще, программировать нужно так, как будто все клиенты только и будут пытаться нарушить инварианты ваших классов.&lt;br /&gt;
Защитные копии - ещё одна причина использовать неизменяемые (immutable) объекты в качестве компонентов.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 40. Проектируйте сигнатуры методов внимательно.&lt;/b&gt;&lt;br /&gt;
Здесь собраны советы, не вошедшие в другие параграфы.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Выбирайте наиболее подходящие имена для методов.&lt;/li&gt;
&lt;li&gt;Не нужно слишком много &quot;удобных&quot; методов. Для каждого действия, обеспечиваемого классом или интерфейсом, пишите ровно один полнофункциональный метод. Особенно это касается интерфейсов. Добавляйте укороченный метод только если он будет часто использоваться.&lt;/li&gt;
&lt;li&gt;Избегайте большого числа параметров. Лучше всего, когда их не больше четырёх. Три способа уменьшить их количество: разбить метод на несколько, создать вспомогающий класс, группирующий часть параметров, использовать шаблон Builder.&lt;/li&gt;
&lt;li&gt;В типах параметров предпочитайте интерфейсы вместо имплементирующих классов.&lt;/li&gt;
&lt;li&gt;Предпочитайте двухэлементый &lt;code&gt;enum&lt;/code&gt; вместо &lt;code&gt;boolean&lt;/code&gt;-параметра, где возможно. Например, если конструктор класса &lt;code&gt;Thermometer&lt;/code&gt; принимает параметр, определяющий единицу измерения температуры, то лучше единицы измерения засунуть в &lt;code&gt;enum&lt;/code&gt;, нежели выбирать одну в случае &lt;code&gt;true&lt;/code&gt; и вторую в случае &lt;code&gt;false&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Item 41. Используйте перегрузку (overload) осторожно.&lt;/b&gt;&lt;br /&gt;
В отличие от переопределения (override), перегрузка работает контринтуитивно: выбор метода происходит во время компиляции, а не в рантайме. Поэтому перегрузку следует применять только там, где этот выбор очевиден. Лучше всего, когда все взаимоперегружающие методы имеют разное количество параметров.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 42. Используйте varargs разумно.&lt;/b&gt;&lt;br /&gt;
Varargs - аргументы переменной длины. При замене аргументов метода на varargs следует учесть все возможные последствия, поскольку некоторые не компилируемые ранее вызовы метода станут допустимыми. Кроме того, не стоит забывать о возможной потере в производительности. Один из вариантов обойти эту потерю - предоставить отдельные методы для 1, 2, 3, ... аргументов и отдельный с varargs.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 43. Возвращайте пустые массивы и коллекции, а не &lt;code&gt;null&lt;/code&gt;.&lt;/b&gt;&lt;br /&gt;
Возвращать &lt;code&gt;null&lt;/code&gt; вместо пустого массива или коллекции нет смысла. Это лишь добавляет лишний код в методе и лишний код для обработки его возвращаемого значения. Если создавать пустую коллекцию или массив слишком дорого, то можно их кэшировать.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 44. Пишите комментарии к каждому экспортируемому элементу API.&lt;/b&gt;&lt;br /&gt;
Вряд ли кто-нибудь станет с этим спорить. Про утилиту javadoc знают почти все, а этот параграф посвящает в основы документирования API для последующего её применения.&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingbreak.blogspot.com/feeds/4222350872977807328/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://codingbreak.blogspot.com/2010/12/effective-java.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/4222350872977807328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/4222350872977807328'/><link rel='alternate' type='text/html' href='http://codingbreak.blogspot.com/2010/12/effective-java.html' title='Effective Java: Методы'/><author><name>Сергей</name><uri>http://www.blogger.com/profile/06072560179480119743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7470289436282357198.post-4503566337351056238</id><published>2010-11-17T00:01:00.003+03:00</published><updated>2011-01-19T21:48:50.817+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="effective java"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Effective Java: Enums and Annotations</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;
&lt;b&gt;Item 30. Используйте &lt;code&gt;enum&lt;/code&gt;-ы вместо целочисленных контант.&lt;/b&gt;&lt;br /&gt;
В Java 1.5 был введён новый тип - &lt;code&gt;enum&lt;/code&gt; (перечисление). Перечисление имеет фиксированный набор допустимых значений: это могут быть времена года, планеты солнечной системы, масти игральных карт и т. п. Основная идея &lt;code&gt;enum&lt;/code&gt;-ов: это классы, экпортирующие по одному экземпляру для каждого своего значения. &lt;code&gt;Enum&lt;/code&gt;-ы - это обобщение синглотонов.&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;code&gt;Enum&lt;/code&gt;-ы обеспечивают безопасность программы на этапе компиляции. Если вы объявляете параметр &lt;code&gt;enum&lt;/code&gt;-типа, то гарантируется, что значение, которое будет передано методу, будет одним из элементов этого &lt;code&gt;enum&lt;/code&gt;-а и не &lt;code&gt;null&lt;/code&gt;. Попытки передать значение неправильного типа, ровно как и использование &lt;code&gt;==&lt;/code&gt; для сравнения элементов различных &lt;code&gt;enum&lt;/code&gt;-ов, приведут к ошибкам на этапе компиляции программы.&lt;br /&gt;
В &lt;code&gt;enum&lt;/code&gt;-ы можно добавлять свои собственные методы, чтобы, например, ассоциировать некоторые данные с конкретными элементами. Можно имплементировать ими интерфейсы; в них уже имплементированы &lt;code&gt;Comparable&lt;/code&gt; и &lt;code&gt;Serializable&lt;/code&gt;. Есть готовые методы &lt;code&gt;ordinal()&lt;/code&gt;, &lt;code&gt;valueOf(String)&lt;/code&gt; и &lt;code&gt;toString()&lt;/code&gt;. Допустимо добавлять даже абстрактные методы, чтобы обеспечить каждый элемемент перечисления собственной реализацией.&lt;br /&gt;
Для ознакомления с другими, реже применяемыми особенностями &lt;code&gt;enum&lt;/code&gt;-ов рекомендуется прочитать параграф из книги целиком.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 31. Используйте поля-члены &lt;code&gt;enum&lt;/code&gt;-ов вместо их порядковых номеров.&lt;/b&gt;&lt;br /&gt;
Все &lt;code&gt;enum&lt;/code&gt;-ы имеют метод &lt;code&gt;ordinal()&lt;/code&gt;, возврающий порядковый номер элемента, но его использование почти всегда затрудняет поддержку и развитие кода. Вместо него лучше вводить собственные поля и работать с их значениями.&lt;br /&gt;
В спецификации метода &lt;code&gt;ordinal()&lt;/code&gt; написано: &quot;Most programmers will have no use for this method. It is designed for use by general-purpose &lt;code&gt;enum&lt;/code&gt;-based data structures such as &lt;code&gt;EnumSet&lt;/code&gt; and &lt;code&gt;EnumMap&lt;/code&gt;.&quot; Если вы не пишите подобную структуру, то лучше всего обходить этот метод стороной.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 32. Используйте &lt;code&gt;EnumSet&lt;/code&gt; вместо битовых полей.&lt;/b&gt;&lt;br /&gt;
Если элементы перечисляемого типа используются в множествах (set), одним из способов реализации является набор констант-степеней двойки с последующим применением битовой арифметики к ним. Этот путь опасен и неудобен. Вместо него рекомендуется использовать уже готовую реализацию - &lt;code&gt;EnumSet&lt;/code&gt;. К слову, если количество элементов в &lt;code&gt;enum&lt;/code&gt;-е не более 64х, то в &lt;code&gt;EnumSet&lt;/code&gt;-е используется та же самая битовая арифметика, а данные о наборе лежат в одном long-е, что обеспечивает максимальную производительность структуры.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 33. Используйте &lt;code&gt;EnumMap&lt;/code&gt; вместо индексации номеров.&lt;/b&gt;&lt;br /&gt;
Аналогично предыдущему параграфу, только &lt;code&gt;Map&lt;/code&gt; вместо &lt;code&gt;Set&lt;/code&gt;. Имплементация Map, использующая элементы &lt;code&gt;enum&lt;/code&gt;-а в качестве ключей, уже готова - &lt;code&gt;EnumMap&lt;/code&gt;, и не нужно придумывать ничего своего. Внутри неё для хранения данных используется обычный массив, что обеспечивает хорошую производительность.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 34. Эмулируйте наследование от &lt;code&gt;enum&lt;/code&gt;-ов с помощью интерфейсов.&lt;/b&gt;&lt;br /&gt;
Наследование для &lt;code&gt;enum&lt;/code&gt;-ов запрещено не случайно. Но в некоторых случаях подобный механизм просто необходим (например, если речь идёт об опкодах, и нужно в клиентском коде уметь создавать свои). Для этого очень удобно объявить единый интерфейс, отделённый от перечисления, и имплементировать его &lt;code&gt;enum&lt;/code&gt;-ом.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 35. Предпочитайте аннотации вместо соглашений о наименованиях.&lt;/b&gt;&lt;br /&gt;
До релиза Java 1.5 в программах применялись соглашения о наименованиях, чтобы указать на особое трактование некоторых элементов кода. Например, &lt;code&gt;JUnit&lt;/code&gt; изначально требовал называть тестовые методы, начиная со слова &lt;code&gt;test&lt;/code&gt;. Такой подход имеет массу очевидных недостатков. Все эти проблемы были успешно решены в Java 1.5 с помощью аннотаций (annotations).&lt;br /&gt;
Параграф приводит несколько примеров создания своих аннотаций. Вывод таков, что аннотации - достаточно мощный и полезный инструмент, и теперь нет причин использовать соглашения о наименованиях.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 36. Нерпеменно используйте аннотацию &lt;code&gt;Override&lt;/code&gt;.&lt;/b&gt;&lt;br /&gt;
Аннотацию &lt;code&gt;Override&lt;/code&gt; можно применять только к объявлениям методов. Она указывает на то, что объявление метода переопределяет его объявление в суперклассе. Повсеместное использование этой аннотации поможет избавиться от проблем, возникающих, когда допускается ошибка в объявлении метода, и вместо переопределения происходит его перегрузка (overloading, это когда два метода имеют одинаковые названия, но разные параметры). Современные среды разработки производят инспекции кода и предупреждают о возможности таких проблем.&lt;br /&gt;
Начиная с релиза 1.6, аннотацию &lt;code&gt;Override&lt;/code&gt; можно использовать не только в подклассах, но и в подинтерфейсах.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 37. Используйте интерфейсы-маркеры (marker interfaces) для определения типов.&lt;/b&gt;&lt;br /&gt;
Интерфейс-маркер не содержит методов и полей, а только помечает класс, который его имплементирует, как имеющий определённое свойство. Очевидный пример - интерфейс &lt;code&gt;Serializable&lt;/code&gt;.&lt;br /&gt;
Интерфейсы-маркеры имеют следующие преимущества перед маркирующими аннотациями (Item 35):&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Они определяют тип, что позволяет осуществлять проверку на этапе компиляции. Например, метод &lt;code&gt;ObjectOutputStream.write(Object)&lt;/code&gt; должен бы в качестве параметра принимать не &lt;code&gt;Object&lt;/code&gt;, а &lt;code&gt;Serializable&lt;/code&gt;. Но по необъяснимым причинам авторы класса этого не сделали.&lt;/li&gt;
&lt;li&gt;Интерфейсы могут наследоваться, что позволяет более точно осуществлять таргетинг. Примером здесь служит интерфейс &lt;code&gt;Set&lt;/code&gt;, наследующийся от &lt;code&gt;Collection&lt;/code&gt; и не добавляющий никаких методов. На самом деле &lt;code&gt;Set&lt;/code&gt; - не совсем интерфейс-маркер, так как он переопределяет контракты некоторых методов интерфейса &lt;code&gt;Collection&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;Преимущества аннотаций-маркеров перед интерфейсами:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;В аннотацию можно легко вложить со временем дополнительную информацию, что невозможно для интерфейса. Интерфейс вообще нельзя изменять после того, как его имплементировали.&lt;/li&gt;
&lt;li&gt;Аннотации можно применять не только к классам и интерфейсам, но и к другим программным элементам, таким, как члены или любые объявления. Поэтому именно их зачастую используют в различных фреймворках.&lt;/li&gt;
&lt;/ol&gt;В конечном итоге, аннотацию-маркер следует использовать, если её нужно применять не только к типам, но и к другим программным элементам, либо если маркер, возможно, будет эволюционировать. В остальных случаях, особенно если будут методы, принимающие только маркированные объекты, лучше применять интерфейс.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;P.S.&lt;/b&gt; На андроиде &lt;code&gt;enum&lt;/code&gt;-ы не очень хороши и рекомендуется их избегать. &lt;a href=&quot;http://developer.android.com/guide/practices/design/performance.html#avoid_enums&quot;&gt;Читать&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingbreak.blogspot.com/feeds/4503566337351056238/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://codingbreak.blogspot.com/2010/11/effective-java-enums-and-annotations.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/4503566337351056238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/4503566337351056238'/><link rel='alternate' type='text/html' href='http://codingbreak.blogspot.com/2010/11/effective-java-enums-and-annotations.html' title='Effective Java: Enums and Annotations'/><author><name>Сергей</name><uri>http://www.blogger.com/profile/06072560179480119743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7470289436282357198.post-3821060112395344110</id><published>2010-11-07T21:48:00.001+03:00</published><updated>2011-01-19T21:47:32.253+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="effective java"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Effective Java: Generics</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Переходим к следующей главе книги. О том, что это за серия постов и зачем, можно прочитать в &lt;a href=&quot;http://codingbreak.blogspot.com/2010/09/effective-java.html&quot;&gt;первом сообщении серии&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 23. Не используйте raw классы в новом коде.&lt;/b&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Generic-и были добавлены в Java 1.5, чтобы сделать программы более безопасными и читаемыми. Поддержка raw-типов сохранилась &lt;u&gt;только&lt;/u&gt; для обратной совместимости программ. При написании нового кода не стоит их использовать, так как это небезопасно.&lt;br /&gt;
Иногда воспользоваться generic-ами не представляется возможным, например, когда неизвестно, что будет лежать в передаваемой коллекции. Для этого случая в языке предусмотрены bounded и unbounded wildcard types.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 24. Не игнорируйте предупреждения компилятора об опасном преобразовании типов.&lt;/b&gt;&lt;br /&gt;
Чтобы написать по-настоящему безопасный код, который не будет порождать ошибки времени выполнения, нужно рассматривать каждое такое предупреждение компилятора.&lt;br /&gt;
Если избавиться от предупреждения по каким-либо причинами невозможно, но сам код точно безопасный, тогда (и только тогда) следует использовать аннотацию &lt;code&gt;@SuppressWarnings(&quot;unchecked&quot;)&lt;/code&gt;, причём применять её нужно всегда на как можно меньший кусок кода. Рекомендуется к каждому использованию этой аннотации добавлять комментарий, объясняющий, почему код безопасен.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 25. Используйте списки (lists) вместо массивов.&lt;/b&gt;&lt;br /&gt;
Отмечается два важных отличия массивов и типизированных контейнеров.&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Массивы - ковариантны, Generic-и - инвариантны. Это значит, что если Sub - подкласс класса Super, то Sub[] - подкласс Super[], что неверно для типизированных классов. Это делает использование типизированных контейнеров более безопасным, чем использование массивов (хотя на первый взгляд кажется, что это только доставляет неудобства).&lt;/li&gt;
&lt;li&gt;Проверка типов для массивов происходит во время выполнения программы, а использование Generic-ов накладывает ограничения только на этапе компиляции, в рантайме же эта информация о типизации совершенно не используется (вернее сказать, её к этому времени просто уже нет).&lt;/li&gt;
&lt;/ol&gt;В связи с этими фундаментальными различиями массивы и типизированные классы довольно плохо комбинируются. В большинстве случаев нужно вместо массивов использовать типизированные списки, жертвуя тем самым некоторой производительностью в пользу безопасности.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 26. Предпочитайте типизированные классы (generic types).&lt;/b&gt;&lt;br /&gt;
Generic-и - это хорошо, и если можно добавить их к классу, то нужно это сделать. В параграфе описывается процесс изменения класса для его типизации.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 27. Предпочитайте типизированные методы (generic methods).&lt;/b&gt;&lt;br /&gt;
Аналогично предыдущему параграфу. Отмечается удобство использования типизированных фабричных методов:&lt;br /&gt;
Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; anagrams = newHashMap();&lt;br /&gt;
вместо&lt;br /&gt;
Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; anagrams = new HashMap&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt;();&lt;br /&gt;
Generic-и могут быть рекурсивными.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 28. Используйте bounded wildcards для улучшения своего API.&lt;/b&gt;&lt;br /&gt;
Как было сказано выше, generic-и инвариантны, т.е. List&amp;lt;String&amp;gt; не является подклассом List&amp;lt;Object&amp;gt;. Иногда это доставляет серьёзные неудобства, но есть выход - bounded wildcards. Они бывают двух видов - &quot;extends&quot; и &quot;super&quot;, каждый из которых покрывает, соответственно, все подклассы и все суперклассы указанного типа. Для того, чтобы быстро соображать, какой их них следует использовать, можно пользоваться т.н. правилом PECS: &quot;PECS stands for producer-extends, consumer-super.&quot;&lt;br /&gt;
Не рекомендуется использовать wildcard-типы в качестве возвращаемых типов.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 29. Про безопасные гетерогенные контейнеры.&lt;/b&gt;&lt;br /&gt;
Типичное применение generic-ов (как в Collections API) ограничивает нас фиксированным числом типовых параметров контейнера. Это ограничение можно обойти, если типизировать не контейнер целиком, а только его ключ. В данном параграфе приводится пример написания такого безопасного контейнера, а также отмечаются некоторые особенности класса Class&amp;lt;T&amp;gt; как параметризированного типа.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingbreak.blogspot.com/feeds/3821060112395344110/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://codingbreak.blogspot.com/2010/11/effective-java-generics.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/3821060112395344110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/3821060112395344110'/><link rel='alternate' type='text/html' href='http://codingbreak.blogspot.com/2010/11/effective-java-generics.html' title='Effective Java: Generics'/><author><name>Сергей</name><uri>http://www.blogger.com/profile/06072560179480119743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7470289436282357198.post-6720318441032733768</id><published>2010-10-13T00:32:00.002+04:00</published><updated>2011-01-19T21:46:41.702+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="effective java"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Effective Java: Классы и интерфейсы</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Продолжение серии постов об основных идеях книги Effective Java (2-е издание).&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;Item 13. Минимизируйте доступность классов и их членов.&lt;/b&gt;&lt;br /&gt;
Известное правило: каждый класс, метод или поле класса нужно делать настолько недоступными, насколько это возможно. Другими словами, необходимо минимизировать открытость вашей программы до тех пор, пока это возможно для использования её по назначению.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 14. В открытых (public) классах всегда используйте гетеры и сетеры (getters and setters) вместо открытых полей.&lt;/b&gt;&lt;br /&gt;
Открытые классы никогда не должны обеспечивать прямой доступ к своим полям, чтобы не позволить нарушить целостность данных. В меньшей степени это относится к неизменяемым (immutable) полям, однако, прежде, чем открыть доступ к такому полю, следует помнить, что публичный API класса нельзя будет изменить в будущем.&lt;br /&gt;
Если класс приватный (private) или пакето-приватный (package-private), то допустимо применение прямого доступа к полям.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 15. Старайтесь писать неизменяемые (immutable) классы.&lt;/b&gt;&lt;br /&gt;
Этому есть несколько причин:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;неизменяемые классы просты для понимания и применения;&lt;/li&gt;
&lt;li&gt;они не требуют синхронизации многопоточного доступа;&lt;/li&gt;
&lt;li&gt;их компоненты также неизменяемы, их можно использовать и в других экземплярах класса, избегая копирования;&lt;/li&gt;
&lt;li&gt;облегчают поддержание инвариантов других, более сложных объектов.&lt;/li&gt;
&lt;/ul&gt;Единственный недостаток у неизменяемых классов - это то, что для каждого значения нужен новый объект, что увеличивает используемый объём памяти.&lt;br /&gt;
В начале параграфа приводится необходимое и достаточное условие того, чтобы класс был неизменяемым.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 16. Предпочитайте композицию вместо наследования.&lt;/b&gt;&lt;br /&gt;
Наследование - мощный инструмент, но, будучи применённым неправильно, может сделать программу уязвимой. Наследование вполне допустимо, если суперкласс и наследники находятся под контролем одних и тех же программистов. В ином случае возникает опасность.&lt;br /&gt;
Наследование нарушает инкапсуляцию. Чтобы правильно отнаследоваться от класса, нужно знать, как он работает. Таким образом, если изменится суперкласс, его подклассы могут перестать функционировать. Поэтому каждый класс должен быть либо спроектирован для наследования от него клиентским кодом, либо такое наследование должно быть запрещено.&lt;br /&gt;
Зачастую, можно отказаться от наследования, заменив его композицией, то есть вместо подкласса написав т.н. класс-обёртку (wrapper).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 17. Проектируйте и документируйте возможность наследования от класса, либо запрещайте это наследование.&lt;/b&gt;&lt;br /&gt;
Если предполагается, что от класса будут наследоваться, то нужно документировать не только то, &lt;i&gt;что&lt;/i&gt; перегружаемые методы делают, но и то, &lt;i&gt;как&lt;/i&gt; они это делают. Безусловно, это нарушает инкапсуляцию.&lt;br /&gt;
Кроме того, необходимо открыть доступ к некоторым внутренностям такого класса с помощью модификатора protected.&lt;br /&gt;
Есть ещё один важный момент: ни конструктор, ни методы clone, readObject не должны вызывать перегружаемые методы, прямо или косвенно. В книге приводится хороший пример, демонстрирующий это.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 18. Предпочитайте интерфейсы абстрактным классам.&lt;/b&gt;&lt;br /&gt;
Поскольку Java не поддерживает множественное наследование, применение абстрактных классов сильно ограничено по сравнению с интерфейсами. Вообще, у интерфейсов много преимуществ по сравнению с абстрактными классами, достаточно очевидных, но есть и недостаток: внести изменения в уже существующий, широко применяемый интерфейс практически невозможно.&lt;br /&gt;
Стоит заметить возможность комбинирования преимуществ абстрактных классов и интефейсов путём введения т.н. skeletal implementation. Наиболее известные примеры этого - AbstractCollection, AbstractMap, AbstractSet и AbstractList.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 19. Используйте интерфейсы только для определения типов.&lt;/b&gt;&lt;br /&gt;
Другими словами, не нужно их использовать не по назначению, например, для хранения значений констант.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 20. Предпочитайте иерархии классов вместо tagged классов.&lt;/b&gt;&lt;br /&gt;
Под tagged классом имеется в виду такой класс, который содержит некоторое поле-тег, определяющее его поведение. Приведён пример такой реализации класса Shape, в котором есть поле shape, определяющее конкретную форму объекта. Такой подход имеет ряд недостатков и не имеет значительных преимуществ. Вместо этого рекомендуется строить иерархию классов. В данном случае следовало бы организовать абстрактный класс Figure, в котором объявляются основные методы, и классы-наследники, каждый из которых представляет конкретную фигуру.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 21. Используйте объекты-функции (function objects) для представления стратегий (strategies).&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;http://en.wikipedia.org/wiki/Strategy_pattern&quot;&gt;Шаблон проектирования Стратегия&lt;/a&gt; стоит использовать, когда необходимо определить поведение некоторой функции путём передачи ей другой функции. Ярким примером использования этого шаблона в Java является интерфейс Comparator.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 22. Предпочитайте статические внутренние классы вместо нестатических.&lt;/b&gt;&lt;br /&gt;
Есть 4 типа внутренних классов: статические, нестатические, анонимные и локальные. Каждый из этих типов имеет своё применение, о чём и рассказано в параграфе.&lt;br /&gt;
Хотелось бы отметить следующее: синтаксически разница между статическими и нестатическими внутренними классами очень мала - первый объявлен с модификатором static, второй - нет. Однако, на деле эти два типа имеют значительные различия. Общее правило для выбора между ними таково: если внутренний класс не требует доступа к содержащему его экземпляру, то следует использовать статический класс.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingbreak.blogspot.com/feeds/6720318441032733768/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://codingbreak.blogspot.com/2010/10/effective-java.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/6720318441032733768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/6720318441032733768'/><link rel='alternate' type='text/html' href='http://codingbreak.blogspot.com/2010/10/effective-java.html' title='Effective Java: Классы и интерфейсы'/><author><name>Сергей</name><uri>http://www.blogger.com/profile/06072560179480119743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7470289436282357198.post-1924026672678494472</id><published>2010-09-29T19:04:00.004+04:00</published><updated>2011-01-19T21:45:36.995+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="effective java"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Effective Java: Общие для всех объектов методы</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Следующая глава книги.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 8. Соблюдайте контракт метода &lt;code&gt;equals&lt;/code&gt;, переопределяя его.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Случаи, когда переопределять метод &lt;code&gt;equals&lt;/code&gt; не требуется:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;каждый экземпляр класса по определению уникален;&lt;/li&gt;
&lt;li&gt;нет необходимости сравнивать экземпляры &quot;логически&quot;;&lt;/li&gt;
&lt;li&gt;суперкласс переопределил этот метод, и его поведение подходит и для данного подкласса;&lt;/li&gt;
&lt;li&gt;класс приватный или package-private и вы уверены, что метод &lt;code&gt;equals&lt;/code&gt; не используется.&lt;/li&gt;
&lt;/ul&gt;Метод &lt;code&gt;equals&lt;/code&gt; необходимо переопределять, если могут существовать различные экземпляры класса, логически эквивалентные друг другу.&lt;br /&gt;
В конце параграфа приводится рецепт хорошей реализации метода и следующие советы:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;всегда следует переопределять метод &lt;code&gt;hashCode&lt;/code&gt; при переопределении &lt;code&gt;equals&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;не надо увлекаться: к примеру, класс &lt;code&gt;File&lt;/code&gt; не углубляется до проверки, указывают ли различные символические ссылки на один и тот же файл;&lt;/li&gt;
&lt;li&gt;объявление метода &lt;code&gt;equals&lt;/code&gt; стоит писать очень внимательно, в противном случае вместо override можно сделать overload и ошибку будет довольно сложно найти.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Item 9. Всегда переопределяйте метод &lt;code&gt;hashCode&lt;/code&gt; при переопределении &lt;code&gt;equals&lt;/code&gt;.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Эквивалентные объекты должны иметь одиннаковый хэш-код. Несоблюдение этого правила приведёт к нарушению работы, как минимум, некоторых коллекций.&lt;br /&gt;
В параграфе приводится ряд рекомендаций по написанию удачной хэш-функции.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 10. Всегда переопределяйте метод &lt;code&gt;toString&lt;/code&gt;.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Это добавляет удобства при использовании класса, так как строка &lt;code&gt;(707) 867-5309&lt;/code&gt; говорит гораздо больше, чем &lt;code&gt;PhoneNumber@163b91&lt;/code&gt;.&lt;br /&gt;
Формат возвращаемой строки может быть как описан, так и не описан в документации класса. Естественно, будучи объявленным в документации, формат не сможет быть изменён в дальнейшем. В любом случае следует обеспечивать программный доступ к полям, используемым в &lt;code&gt;toString&lt;/code&gt;, чтобы не провоцировать клиентский код парсить строку, возвращаемую последним.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 11. Переопределяйте метод &lt;code&gt;clone&lt;/code&gt; с умом.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Этот параграф содержит слишком много пунктов, которые следовало бы написать сюда, поэтому я этого делать не буду. Если нужно спроектировать объект с возможностью клонирования, придётся перечитать параграф целиком. Однако, отдельно хотелось бы отметить следующие факты:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;При переопределении метода &lt;code&gt;clone&lt;/code&gt; в non-final классе всегда следует возвращать объект, полученный вызовом &lt;code&gt;super.clone&lt;/code&gt;, только тогда он будет иметь правильный тип.&lt;/li&gt;
&lt;li&gt;Если класс содержит ссылки на изменяемые (mutable) объекты, то при клонировании эти объекты должны быть рекурсивно склонированы вместо простого копирования ссылок на них, которое происходит по умолчанию. Общее правило таково, что клон и оригинал не должны иметь общих внутренностей, кроме неизменяемых (immutable).&lt;/li&gt;
&lt;li&gt;Иногда можно обойтись копирующим конструктором, это гораздо проще.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Item 12. Подумайте об имплементации интерфейса &lt;code&gt;Comparable&lt;/code&gt;.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Если для объектов рассматриваемого класса существует некоторый естесственный порядок (natural order), имеет смысл имплементировать этот интерфейс. Небольшие усилия, затраченные на создание функции сравнения, открывают для класса всю мощь стандартных алгоритмов и коллекций, требующих существование этого порядка. Обычно этот интерфейс имплементируют классы, представляющие какое-либо значение: число, дату и время и т.д.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingbreak.blogspot.com/feeds/1924026672678494472/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://codingbreak.blogspot.com/2010/09/effective-java_29.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/1924026672678494472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/1924026672678494472'/><link rel='alternate' type='text/html' href='http://codingbreak.blogspot.com/2010/09/effective-java_29.html' title='Effective Java: Общие для всех объектов методы'/><author><name>Сергей</name><uri>http://www.blogger.com/profile/06072560179480119743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7470289436282357198.post-6597172057572960478</id><published>2010-09-29T01:48:00.002+04:00</published><updated>2011-01-19T21:40:51.149+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="effective java"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Effective Java: Создание и уничтожение объектов</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;Дочитал книгу &lt;a href=&quot;http://java.sun.com/docs/books/effective/&quot;&gt;Effective Java 2nd ed.&lt;/a&gt; и решил выделить основные идеи каждого из её параграфов. Прочтение этого никак не может заменить прочтения самой книги, но может послужить, например, для повторения материала.&lt;br /&gt;
Итак, первая после введения глава, Создание и уничтожение объектов (Creating and Destroying Objects).&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;Item 1. Как насчёт использования статических фабричных методов (static factory methods) вместо конструкторов?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Фабричные методы имеют следующие преимущества перед конструкторами:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Им можно подбирать &quot;говорящие&quot; названия. Сравните: &lt;code&gt;new BigInteger(int, int, Random)&lt;/code&gt; и &lt;code&gt;BigInteger.probablePrime(int, Random)&lt;/code&gt; (этот конструктор и фабричный метод делают, по сути, одно и то же).&lt;/li&gt;
&lt;li&gt;Фабричный метод не обязательно должен создавать новый объект, а может, например, получать его из кэша. Например, &lt;code&gt;Integer.valueOf(int)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Фабричный метод может вернуть экземлпяр &lt;i&gt;подкласса&lt;/i&gt; возвращаемого типа. Например, &lt;code&gt;EnumSet.of(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Использование фабричных методов позволяет избежать повторения параметров при создании объектов параметризированных типов:&lt;br /&gt;
&lt;code&gt;Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; m = HashMap.newInstance();&lt;/code&gt;&lt;br /&gt;
(на самом деле такого фабричного метода нет в HashMap)&lt;br /&gt;
против&lt;br /&gt;
&lt;code&gt;Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; m = new HashMap&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt;();&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;Конечно, есть и обратная сторона медали:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Если класс не предоставляет ни одного public или protected конструктора, то от него нельзя будет отнаследоваться.&lt;/li&gt;
&lt;li&gt;В javadoc-документации фабричные методы не отличимы от других статических методов, в отличие от конструкторов, которые выделены в отдельную таблицу.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;Item 2. Примите во внимание использование шаблона Builder вместо конструктора с большим числом параметров.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Если класс предоставляет конструкторы с большим числом параметров, в том числе телескопические (telescoping constructor), клиентский код этого класса будет трудно писать и ещё труднее читать. Паттерн JavaBeans (с конструктором без параметров, но с гетерами и сетерами) &quot;многословен&quot;, лишает возможности создания неизменяемых объектов (immutable objects) и оставляет возможность использования не инициализированных до конца объектов. Шаблон Builder лишён вышеперечисленных недостатков, хотя имеет и парочку своих.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 3. При создании классов-одиночек (singleton) используйте приватные конструкторы и перечисления (enum).&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Название говорит само за себя. Приватный конструктор можно вызвать, используя reflection, и он не подходит для сериализуемых синглтонов (об этом в последней главе книги), поэтому самый надёжный способ организовать синглтон в Java - использовать для этого Enum с единственным элементом.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 4. Запрещайте создание экземпляров класса с помощью приватного конструктора.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Бесполезно делать инструментарные классы (которые содержат только статические методы) абстрактными - от них можно будет отнаследоваться (а делать класс abstract и final одновременно запрещено). Лучше для таких классов писать приватный конструктор.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 5. Избегайте создания лишних объектов.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Основные идеи: неизменяемые объекты (immutable objects) можно использовать многократно, не создавая новые экземпляры; необходимо следить за автобоксингом (autoboxing), использовать, где возможно, примитивы.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 6. Избавляйтесь от устаревших объектов.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Утечки памяти случаются и в программах на Java. В параграфе приведён пример реализации стека, в котором не зануляются ссылки на выброшенные объекты. Так делать нельзя.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Item 7. Избегайте использование финализаторов.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Правильно писать методы-финализаторы &lt;i&gt;сложно&lt;/i&gt; и чаще всего &lt;i&gt;не нужно&lt;/i&gt;. Они опасны и непредсказуемы. Единственная здравая причина написать финализатор - необходимость предупреждать автора клиентского кода о том, что ваш объект не был завершён (terminated) должным образом.&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingbreak.blogspot.com/feeds/6597172057572960478/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://codingbreak.blogspot.com/2010/09/effective-java.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/6597172057572960478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/6597172057572960478'/><link rel='alternate' type='text/html' href='http://codingbreak.blogspot.com/2010/09/effective-java.html' title='Effective Java: Создание и уничтожение объектов'/><author><name>Сергей</name><uri>http://www.blogger.com/profile/06072560179480119743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7470289436282357198.post-2295398831178835430</id><published>2010-09-17T02:35:00.001+04:00</published><updated>2011-03-04T15:35:07.957+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="математика"/><title type='text'>Элементарный графический движок на Java</title><content type='html'>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4u5Bz1a5KyoNL8YUWQpFia3bx9C7rVjIpNMmhcSM1SzSZBxMMaBq5O3RL2oCivGCEPmbslwhDYLhYHGkK32eOkq66tpd89a3J35Mz5QI5JE6B3TuTAvpvVy7MKvSLTFq6RDvoN9X4WVA/s1600/pyramid.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;317&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4u5Bz1a5KyoNL8YUWQpFia3bx9C7rVjIpNMmhcSM1SzSZBxMMaBq5O3RL2oCivGCEPmbslwhDYLhYHGkK32eOkq66tpd89a3J35Mz5QI5JE6B3TuTAvpvVy7MKvSLTFq6RDvoN9X4WVA/s400/pyramid.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Disclaimer. Данный &quot;движок&quot; написан исключительно for fun и вряд ли сможет найти реальное применение.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Задача&lt;/b&gt;. Объекты в пространстве представлены в виде множества цветных треугольников. Задана позиция наблюдателя и положение прямоугольного &quot;окна&quot;, через которое он смотрит на объекты. Необходимо воспроизвести изображение, которое видит наблюдатель через &quot;окно&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Решение&lt;/b&gt;. Для решения задачи был использован т.н. метод &lt;a href=&quot;http://ru.wikipedia.org/wiki/Ray_casting&quot;&gt;Ray casting&lt;/a&gt;. Грубо говоря, программа &quot;стреляет&quot; лучами через &quot;окно&quot; и определяет, с каким из треугольников луч пересечётся ближе к наблюдателю.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Обозначения&lt;/b&gt;&lt;br /&gt;
O - точка, в которой находится наблюдатель&lt;br /&gt;
G, H, I - три угла &quot;окна&quot;. Со стороны наблюдателя: G - верхний-левый, H - нижний-левый, I - нижний-правый.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Самое интересное здесь - геометрия&lt;/b&gt;. Объясню вкратце, что да как.&lt;br /&gt;
&lt;br /&gt;
Во-первых, построение луча. Конец луча - всегда точка O. Вторая точка P, через которую проходит луч, лежит в &quot;окне&quot; и выбирается следующим образом:&lt;br /&gt;
P = G + HI * w/resW + GH * h/resH,&lt;br /&gt;
где HI - вектор из H в I, GH - вектор из G в H,&lt;br /&gt;
w и h - координаты простреливаемой точки в окне,&lt;br /&gt;
resW и resH - количество точек(разрешение) по горизонтали и вертикали.&lt;br /&gt;
&lt;br /&gt;
Далее для каждого треугольника ищем точку пересечения с ним луча и среди всех пересечений выбираем ближайшее.&lt;br /&gt;
Для начала находим точку пересечения луча и плоскости, в которой лежит треугольник. Уравнение плоскости находим &lt;a href=&quot;http://algolist.manual.ru/maths/geom/equation/plane.php&quot;&gt;так&lt;/a&gt;, а точку пересечения - &lt;a href=&quot;http://algolist.manual.ru/maths/geom/intersect/linefacet3d.php&quot;&gt;так&lt;/a&gt;. Далее, если точка пересечения существует, необходимо определить, лежит ли она внутри треугольника. Для этого был использован следующий факт: точка Q лежит внутри треугольника ABC тогда и только тогда, когда площадь треугольника ABC равна сумме площадей треугольников ABQ, ACQ и BCQ. Площадь треугольника подсчитывается по &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%92%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5&quot;&gt;векторному произведению&lt;/a&gt; двух его сторон. Возвращаясь к точке пересечения с плоскостью: там в результате получилось значение мю, которое представляет собой параметр при параметрическом задании луча. То есть чем больше мю, тем дальше точка пересечения находится от наблюдателя. Поэтому это значение мю очень удобно использовать для поиска ближайшего пересекаемого треугольника: достаточно среди всех мю выбрать наименьшее неотрицательное(отрицательное мю означает, что треугольник находился позади наблюдателя).&lt;br /&gt;
&lt;br /&gt;
После нахождения ближайшего пересекаемого треугольника рисуем пиксель цвета этого треугольника в точке (w, h).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Спецификация входного файла&lt;/b&gt;&lt;br /&gt;
Координаты точек представляют собой вещественные или целые числа, записанные через пробел или табуляцию. Координат три и записываются в привычном порядке: x, y, z. Цвет записывается в виде трёх целых чисел из множества [0, 255] - это R, G и B соответственно.&lt;br /&gt;
&lt;br /&gt;
Входной файл называется input и должен быть расположен в текущей директории.&lt;br /&gt;
&lt;br /&gt;
Входной файл должен содержать в указанном порядке:&lt;br /&gt;
Координаты точки O;&lt;br /&gt;
координаты точек G, H, I;&lt;br /&gt;
разрешение картинки по горизонтали и вертикали resW и resH(целые, положительные);&lt;br /&gt;
количество треугольников - целое, неотрицательное;&lt;br /&gt;
затем для каждого треугольника: координаты трёх вершин и цвет.&lt;br /&gt;
&lt;br /&gt;
Переводы строк допустимы между любыми числами.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Примеры&lt;/b&gt;&lt;br /&gt;
Привожу скриншоты и ссылки на исходники файла input в двух экземлярах.&lt;br /&gt;
1. Пирамида&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4u5Bz1a5KyoNL8YUWQpFia3bx9C7rVjIpNMmhcSM1SzSZBxMMaBq5O3RL2oCivGCEPmbslwhDYLhYHGkK32eOkq66tpd89a3J35Mz5QI5JE6B3TuTAvpvVy7MKvSLTFq6RDvoN9X4WVA/s1600/pyramid.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;317&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4u5Bz1a5KyoNL8YUWQpFia3bx9C7rVjIpNMmhcSM1SzSZBxMMaBq5O3RL2oCivGCEPmbslwhDYLhYHGkK32eOkq66tpd89a3J35Mz5QI5JE6B3TuTAvpvVy7MKvSLTFq6RDvoN9X4WVA/s400/pyramid.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://pastebin.com/Pr8ehGUs&quot;&gt;http://pastebin.com/Pr8ehGUs&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://paste.org.ru/?0tcyqw&quot;&gt;http://paste.org.ru/?0tcyqw&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
2. Пересечение двух треугольников&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFCzfFGtSQa6m2omkXxLvdx3NUk2wqDdt3qSCebD0BM3V80x3SNPDyfOnhp5jvzyj0PTbWc4NBz8ObAxak3jQOe5xahrv7vOW2V-kN5O3bhfv7x2GpDubV4di7uwXsG_zDwNLKLTQTQaE/s1600/intersection.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFCzfFGtSQa6m2omkXxLvdx3NUk2wqDdt3qSCebD0BM3V80x3SNPDyfOnhp5jvzyj0PTbWc4NBz8ObAxak3jQOe5xahrv7vOW2V-kN5O3bhfv7x2GpDubV4di7uwXsG_zDwNLKLTQTQaE/s400/intersection.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://pastebin.com/wUVWLvwN&quot;&gt;http://pastebin.com/wUVWLvwN&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://paste.org.ru/?k4nyz8&quot;&gt;http://paste.org.ru/?k4nyz8&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
3. Перспектива&lt;br /&gt;
Смежные плоскости образуют прямой угол.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNTN7_AU4F3tSQtL64KypxJWjlq1xGgj48XgsLDR7NE8hcbO1iPX6rVFlw9oTrIpvqOfdk8fmrXb06bJBBOU-FWgpZlChMHCeWgYa5M241vycEoCZeuC4CVoCYgvEJnmj_gFm1ZYLUUgQ/s1600/perspective.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNTN7_AU4F3tSQtL64KypxJWjlq1xGgj48XgsLDR7NE8hcbO1iPX6rVFlw9oTrIpvqOfdk8fmrXb06bJBBOU-FWgpZlChMHCeWgYa5M241vycEoCZeuC4CVoCYgvEJnmj_gFm1ZYLUUgQ/s400/perspective.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://pastebin.com/y95Trgdf&quot;&gt;http://pastebin.com/y95Trgdf&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://paste.org.ru/?c0y6ds&quot;&gt;http://paste.org.ru/?c0y6ds&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
4. Рандом&lt;br /&gt;
100 произвольных треугольников в кубе 200x200x200. Картинка рендерится заметно дольше остальных.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWJIqMWq0HdFcB4BlOxuA8hVewlymUHWZSkhhAhjPMJQ8mepZfRf7EzSt32tn7zdtY8wvmfjTWaoykaJbSbn2gI1m8St82cxtOP8eLLL9618uymrnUV7lxXRYXY-rWiFhr_vCrNukxEw8/s1600/random.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWJIqMWq0HdFcB4BlOxuA8hVewlymUHWZSkhhAhjPMJQ8mepZfRf7EzSt32tn7zdtY8wvmfjTWaoykaJbSbn2gI1m8St82cxtOP8eLLL9618uymrnUV7lxXRYXY-rWiFhr_vCrNukxEw8/s400/random.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://pastebin.com/TtbwWE5U&quot;&gt;http://pastebin.com/TtbwWE5U&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://paste.org.ru/?t0i3rc&quot;&gt;http://paste.org.ru/?t0i3rc&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
5. Поворот&lt;br /&gt;
Если вместо угла H указать противоположный, то картинка повернётся.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglTLtKIvQ1C1cmJcqL6ltdjYWEf-vfKOAaz54aesT4LyjPacEa1FoQDxlf15KNy2Y_R9YAxPmFjavLz8VWcLcotWZcBGWkY-vCYqQvNgFpXxIE0Wn2lOSGjdLQBdMujb6ntNhw-3J7xbM/s1600/rotated.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglTLtKIvQ1C1cmJcqL6ltdjYWEf-vfKOAaz54aesT4LyjPacEa1FoQDxlf15KNy2Y_R9YAxPmFjavLz8VWcLcotWZcBGWkY-vCYqQvNgFpXxIE0Wn2lOSGjdLQBdMujb6ntNhw-3J7xbM/s400/rotated.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://pastebin.com/QKQHut45&quot;&gt;http://pastebin.com/QKQHut45&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://paste.org.ru/?jqgdl9&quot;&gt;http://paste.org.ru/?jqgdl9&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
А при первом запуске я получил такую картину:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtlhdczTeXmgfhpjMYRciJLaXmgdTJAwyEFoAr7FmjIqFWMyC_Vk4D5uzToXOKo6iwMk6zBi7TAM33VG5La6ymEr_jD95VY22H8qDmSTTerwbtra6cLla9OBwDaM02PtFxZrQR2hc29E8/s1600/mistake.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;318&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtlhdczTeXmgfhpjMYRciJLaXmgdTJAwyEFoAr7FmjIqFWMyC_Vk4D5uzToXOKo6iwMk6zBi7TAM33VG5La6ymEr_jD95VY22H8qDmSTTerwbtra6cLla9OBwDaM02PtFxZrQR2hc29E8/s400/mistake.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Дело в том, что в программе используется не очевидное сравнение вещественных чисел с нулём a == 0, а более правильное Math.abs(a) &amp;lt; EPS, где EPS - маленькое число. Так вот, оказалось, что константа EPS у меня была настолько маленькой, а float настолько невместительным, что сумма площадей треугольников(см. выше) не сходилась. Поэтому не все пересечения посчитались правильно и оказались видны задние стенки пирамиды.&lt;br /&gt;
Кстати, то же самое касается сравнения на равенство двух вещественных чисел - это общий случай: вместо a == b следует делать Math.abs(a-b) &amp;lt; EPS.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Исходный код&lt;/b&gt;&lt;br /&gt;
Расположение файлов в папках несложно определить из имени пакета.&lt;br /&gt;
&lt;br /&gt;
GeometryHelper.java&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% rgb(255, 255, 255); color: black;&quot;&gt;package com&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;blogspot&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;codingbreak&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;simple3d&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;geometry&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

public class GeometryHelper &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;

    &lt;span style=&quot;color: #3f5fbf;&quot;&gt;/**&lt;/span&gt;
&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;/span&gt;
&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;/span&gt;&lt;span style=&quot;color: #7f9fbf; font-weight: bold;&quot;&gt;@return&lt;/span&gt;&lt;span style=&quot;color: #3f5fbf;&quot;&gt; value m &amp;gt;= 0 so that p = ray.p1 + m * (ray.p2 - ray.p1) is the&lt;/span&gt;
&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*         intersection point. Null if there is no interection points.&lt;/span&gt;
&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;
    public &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;static&lt;/span&gt; Float intersectRayAndTriangle&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;final Ray ray&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt;
            final Triangle triangle&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: dimgrey;&quot;&gt;// calculating the triangle&#39;s plane equation:&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; a &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; b &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; c &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; d &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; triangle
                        &lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                        &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; triangle
                        &lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                        &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; triangle
                        &lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                        &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #e34adc;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;http:&lt;/span&gt;&lt;span style=&quot;color: dimgrey;&quot;&gt;//codingbreak.blogspot.com/ &lt;/span&gt;
        &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; numerator &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; a &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP1&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; b &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP1&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; c &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP1&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; d&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; denominator &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; a &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP2&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP1&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
                &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; b &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP2&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP1&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; c
                &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP2&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP1&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

        Float mu&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;Math&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;abs&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;denominator&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: green;&quot;&gt;1e-6&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
            &lt;span style=&quot;color: dimgrey;&quot;&gt;// denominator == 0 =&amp;gt; ray is parallel to triangle, there is no&lt;/span&gt;
            &lt;span style=&quot;color: dimgrey;&quot;&gt;// intersection point&lt;/span&gt;
            mu &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; null&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt; &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
            mu &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; Float&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;valueOf&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt;numerator &lt;span style=&quot;color: #808030;&quot;&gt;/&lt;/span&gt; denominator&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;mu &lt;span style=&quot;color: #808030;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; null&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
            final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; px &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP1&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; mu
                    &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP2&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP1&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; py &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP1&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; mu
                    &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP2&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP1&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; pz &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP1&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; mu
                    &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP2&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; ray&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getP1&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            final Point p &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; new Point&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;px&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; py&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; pz&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;!&lt;/span&gt;isPointLiesInsideTriangle&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;p&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
                mu &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; null&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
        &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; mu&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;static&lt;/span&gt; boolean isPointLiesInsideTriangle&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;final Point p&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt;
            final Triangle triangle&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; s0 &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; areaOfTriangle&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; triangle
                &lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; s1 &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; areaOfTriangle&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; p&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; s2 &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; areaOfTriangle&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; p&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; s3 &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; areaOfTriangle&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; p&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; Math&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;abs&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;s0 &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; s1 &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; s2 &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; s3&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;background: none repeat scroll 0% 0% rgb(221, 0, 0); color: white; font-style: italic; font-weight: bold;&quot;&gt;1f&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; areaOfTriangle&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;Point a&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; Point b&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; Point c&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; px &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; b&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; a&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; py &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; b&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; a&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; pz &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; b&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; a&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; qx &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; c&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; a&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; qy &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; c&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; a&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; qz &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; c&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; a&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; x &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; py &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; qz &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; pz &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; qy&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; y &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; pz &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; qx &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; px &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; qz&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; z &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; px &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; qy &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; py &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; qx&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; s &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;.5&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; Math&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;sqrt&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;x &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; x &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; y &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; y &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; z &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; z&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; Math&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;abs&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;s&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;
Point.java&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% rgb(255, 255, 255); color: black;&quot;&gt;package com&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;blogspot&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;codingbreak&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;simple3d&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;geometry&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

public class Point &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
    private final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; x&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    private final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; y&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    private final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; z&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

    public Point&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; x&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; y&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; z&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;x &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; x&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;y &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; y&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;z &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; z&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    public &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; x&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    public &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; y&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    public &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; z&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;
Ray.java&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% rgb(255, 255, 255); color: black;&quot;&gt;package com&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;blogspot&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;codingbreak&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;simple3d&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;geometry&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

public class Ray &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
    private final Point p1&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    private final Point p2&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

    public Ray&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;Point p1&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; Point p2&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;p1 &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; p1&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;p2 &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; p2&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    public Point getP1&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; p1&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    public Point getP2&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; p2&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;
Triangle.java&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% rgb(255, 255, 255); color: black;&quot;&gt;package com&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;blogspot&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;codingbreak&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;simple3d&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;geometry&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;awt&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Color&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

public class Triangle &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
    private final Point a&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    private final Point b&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    private final Point c&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    private final Color color&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

    public Triangle&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;Point a&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; Point b&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; Point c&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; Color color&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;a &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; a&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;b &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; b&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;c &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; c&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;color &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; color&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    public Point getA&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; a&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    public Point getB&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; b&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    public Point getC&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; c&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    public Color getColor&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; color&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
&lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;
DemoFrame.java&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% rgb(255, 255, 255); color: black;&quot;&gt;package com&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;blogspot&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;codingbreak&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;simple3d&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;awt&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Color&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;io&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;File&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;io&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;FileNotFoundException&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;util&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;HashSet&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;util&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Scanner&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;util&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Set&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; javax&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;swing&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;JFrame&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; com&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;blogspot&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;codingbreak&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;simple3d&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;geometry&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Point&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; com&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;blogspot&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;codingbreak&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;simple3d&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;geometry&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Triangle&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

class DemoFrame extends JFrame &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;

    public &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #400000;&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #603000;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;]&lt;/span&gt; args&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        new DemoFrame&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;setVisible&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;true&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    public DemoFrame&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        super&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt;Simple3D demo frame&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        setDefaultCloseOperation&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;DISPOSE_ON_CLOSE&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

        Simple3DDrawingPanel drawing &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; null&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        try &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
            drawing &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; loadFromFile&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;new File&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            getContentPane&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;add&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;drawing&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;pack&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt; catch &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;FileNotFoundException e&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
            e&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;printStackTrace&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #3f5fbf;&quot;&gt;/**&lt;/span&gt;
&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Loads all the space information(objects, camera coordinates, etc) from file and&lt;/span&gt;
&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* constructs Simple3DDrawingPanel object.&lt;/span&gt;
&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;/span&gt;
&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;/span&gt;&lt;span style=&quot;color: #7f9fbf; font-weight: bold;&quot;&gt;@param&lt;/span&gt;&lt;span style=&quot;color: #3f5fbf;&quot;&gt; file&lt;/span&gt;
&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* &lt;/span&gt;&lt;span style=&quot;color: #7f9fbf; font-weight: bold;&quot;&gt;@return&lt;/span&gt;&lt;span style=&quot;color: #3f5fbf;&quot;&gt; Simple3DDrawingPanel object&lt;/span&gt;
&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* @throws FileNotFoundException&lt;/span&gt;
&lt;span style=&quot;color: #3f5fbf;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;
    private &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;static&lt;/span&gt; Simple3DDrawingPanel loadFromFile&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;final File file&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;
            throws FileNotFoundException &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        final Scanner in &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; new Scanner&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;file&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        
        final Point o &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; readPoint&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;in&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final Point g &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; readPoint&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;in&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final Point h &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; readPoint&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;in&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final Point i &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; readPoint&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;in&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; resolutionW &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; in&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextInt&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; resolutionH &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; in&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextInt&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; n &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; in&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextInt&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: dimgrey;&quot;&gt;// the number of triangles&lt;/span&gt;
        final Set&lt;span style=&quot;color: #808030;&quot;&gt;&amp;lt;&lt;/span&gt;Triangle&lt;span style=&quot;color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt; triangles &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; new HashSet&lt;span style=&quot;color: #808030;&quot;&gt;&amp;lt;&lt;/span&gt;Triangle&lt;span style=&quot;color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;n&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; j &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008c00;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; j &lt;span style=&quot;color: #808030;&quot;&gt;&amp;lt;&lt;/span&gt; n&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;j&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
            final Point a &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; readPoint&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;in&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            final Point b &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; readPoint&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;in&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            final Point c &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; readPoint&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;in&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            final Color color &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; readColor&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;in&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            
            final Triangle triangle &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; new Triangle&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;a&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; b&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; c&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; color&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            triangles&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;add&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;triangle&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

        in&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;close&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final Simple3DDrawingPanel drawingPanel &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; new Simple3DDrawingPanel&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;o&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt;
                g&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; h&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; i&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; resolutionW&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; resolutionH&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; triangles&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; drawingPanel&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    private &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;static&lt;/span&gt; Point readPoint&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;final Scanner in&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; x &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; in&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextFloat&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; y &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; in&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextFloat&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; z &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; in&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextFloat&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; new Point&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;x&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; y&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; z&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    private &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;static&lt;/span&gt; Color readColor&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;final Scanner in&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; colorR &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; in&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextInt&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; colorG &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; in&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextInt&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; colorB &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; in&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextInt&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; new Color&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;colorR&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; colorG&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; colorB&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

&lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;
RandomGenerator.java&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% rgb(255, 255, 255); color: black;&quot;&gt;package com&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;blogspot&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;codingbreak&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;simple3d&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;io&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;File&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;io&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;FileNotFoundException&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;io&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;PrintWriter&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;util&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Random&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

public class RandomGenerator &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;

    private &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; bound &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;background: none repeat scroll 0% 0% rgb(221, 0, 0); color: white; font-style: italic; font-weight: bold;&quot;&gt;200f&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    private &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; deltaX &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;background: none repeat scroll 0% 0% rgb(221, 0, 0); color: white; font-style: italic; font-weight: bold;&quot;&gt;1000f&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

    public &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;void&lt;/span&gt; &lt;span style=&quot;color: #400000;&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #603000;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;]&lt;/span&gt; args&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; throws FileNotFoundException &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        PrintWriter out &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; new PrintWriter&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;new File&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt;random&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

        out
                &lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;print&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt;0 0 0&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt;500 -320 240&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt;500 -320 -240&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt;500 320 -240&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt;640 480&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; n &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008c00;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        out&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;print&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;n&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        out&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;print&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

        Random generator &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; new Random&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; i &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008c00;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; i &lt;span style=&quot;color: #808030;&quot;&gt;&amp;lt;&lt;/span&gt; n&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;i&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
            &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; j &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008c00;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; j &lt;span style=&quot;color: #808030;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #008c00;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;j&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
                &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; x &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;generator&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextFloat&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;.5&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; bound&lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;deltaX&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
                &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; y &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;generator&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextFloat&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;.5&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; bound&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
                &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; z &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;generator&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextFloat&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;.5&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; bound&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

                out&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;printf&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;%f&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;%f&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;%f&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; x&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; y&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; z&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
            &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; r &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; generator&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextInt&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008c00;&quot;&gt;256&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; g &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; generator&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextInt&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008c00;&quot;&gt;256&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; b &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; generator&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;nextInt&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #008c00;&quot;&gt;256&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            out&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;printf&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;color: #0000e6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: #0f69ff;&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: maroon;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; r&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; g&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; b&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

        out&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;close&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

&lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;
Simple3DDrawingPanel.java&lt;br /&gt;
&lt;pre style=&quot;background: none repeat scroll 0% 0% rgb(255, 255, 255); color: black;&quot;&gt;package com&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;blogspot&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;codingbreak&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;simple3d&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;awt&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Color&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;awt&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Dimension&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;awt&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Graphics&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; java&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;util&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Set&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; javax&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;swing&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;JPanel&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; com&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;blogspot&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;codingbreak&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;simple3d&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;geometry&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;GeometryHelper&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; com&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;blogspot&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;codingbreak&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;simple3d&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;geometry&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Point&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; com&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;blogspot&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;codingbreak&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;simple3d&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;geometry&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Ray&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;import&lt;/span&gt; com&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;blogspot&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;codingbreak&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;simple3d&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;geometry&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;Triangle&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

public class Simple3DDrawingPanel extends JPanel &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;

    private &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;static&lt;/span&gt; Color BACKGROUND_COLOR &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; Color&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;BLACK&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

    private Point O&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    private Point G&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    private Point H&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    private Point I&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    private Set&lt;span style=&quot;color: #808030;&quot;&gt;&amp;lt;&lt;/span&gt;Triangle&lt;span style=&quot;color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt; triangles&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    private &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; resolutionW&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    private &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; resolutionH&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

    public Simple3DDrawingPanel&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;final Point o&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; final Point g&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; final Point h&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt;
            final Point i&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; resolutionW&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; resolutionH&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt;
            final Set&lt;span style=&quot;color: #808030;&quot;&gt;&amp;lt;&lt;/span&gt;Triangle&lt;span style=&quot;color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt; triangles&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;G &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; g&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;H &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; h&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;I &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; i&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;resolutionW &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; resolutionW&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;resolutionH &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; resolutionH&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;triangles &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; triangles&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;O &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; o&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        setPreferredSize&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;new Dimension&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;resolutionW&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; resolutionH&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    private Point getPointByCoordinates&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; w&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; h&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; x &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; G&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;I&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; H&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; w &lt;span style=&quot;color: #808030;&quot;&gt;/&lt;/span&gt; resolutionW
                &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;H&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; G&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getX&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; h &lt;span style=&quot;color: #808030;&quot;&gt;/&lt;/span&gt; resolutionH&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; y &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; G&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;I&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; H&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; w &lt;span style=&quot;color: #808030;&quot;&gt;/&lt;/span&gt; resolutionW
                &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;H&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; G&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getY&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; h &lt;span style=&quot;color: #808030;&quot;&gt;/&lt;/span&gt; resolutionH&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        final &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;float&lt;/span&gt; z &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; G&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;I&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; H&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; w &lt;span style=&quot;color: #808030;&quot;&gt;/&lt;/span&gt; resolutionW
                &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;H&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;-&lt;/span&gt; G&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getZ&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;*&lt;/span&gt; h &lt;span style=&quot;color: #808030;&quot;&gt;/&lt;/span&gt; resolutionH&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;return&lt;/span&gt; new Point&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;x&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; y&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; z&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

    &lt;span style=&quot;color: #808030;&quot;&gt;@&lt;/span&gt;Override
    public &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;void&lt;/span&gt; paintComponent&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;Graphics g&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
        super&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;paintComponent&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;g&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        g&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;setColor&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;Color&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;BLACK&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; w &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008c00;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; w &lt;span style=&quot;color: #808030;&quot;&gt;&amp;lt;&lt;/span&gt; resolutionW&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; w&lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
            &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;int&lt;/span&gt; h &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008c00;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; h &lt;span style=&quot;color: #808030;&quot;&gt;&amp;lt;&lt;/span&gt; resolutionH&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;+&lt;/span&gt;h&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
                final Point point &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; getPointByCoordinates&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;w&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; h&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
                final Ray ray &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; new Ray&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;O&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; point&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;

                Float mu &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; null&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
                Color color &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; null&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
                &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;final Triangle triangle &lt;span style=&quot;color: purple;&quot;&gt;:&lt;/span&gt; triangles&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
                    final Float muCurrent &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; GeometryHelper
                            &lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;intersectRayAndTriangle&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;ray&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
                    &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;muCurrent &lt;span style=&quot;color: #808030;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; null &lt;span style=&quot;color: #808030;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;mu &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; null &lt;span style=&quot;color: #808030;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;|&lt;/span&gt; mu &lt;span style=&quot;color: #808030;&quot;&gt;&amp;gt;&lt;/span&gt; muCurrent&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
                        mu &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; muCurrent&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
                        color &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; triangle&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;getColor&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
                    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
                &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
                &lt;span style=&quot;color: maroon; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;mu &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; null&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt; &lt;span style=&quot;color: purple;&quot;&gt;{&lt;/span&gt;
                    color &lt;span style=&quot;color: #808030;&quot;&gt;=&lt;/span&gt; BACKGROUND_COLOR&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
                &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

                g&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;setColor&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;color&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
                g&lt;span style=&quot;color: #808030;&quot;&gt;.&lt;/span&gt;drawRect&lt;span style=&quot;color: #808030;&quot;&gt;(&lt;/span&gt;w&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; h&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #008c00;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #008c00;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #808030;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: purple;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
        &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
    &lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;

&lt;span style=&quot;color: purple;&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codingbreak.blogspot.com/feeds/2295398831178835430/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://codingbreak.blogspot.com/2010/09/java.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/2295398831178835430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7470289436282357198/posts/default/2295398831178835430'/><link rel='alternate' type='text/html' href='http://codingbreak.blogspot.com/2010/09/java.html' title='Элементарный графический движок на Java'/><author><name>Сергей</name><uri>http://www.blogger.com/profile/06072560179480119743</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4u5Bz1a5KyoNL8YUWQpFia3bx9C7rVjIpNMmhcSM1SzSZBxMMaBq5O3RL2oCivGCEPmbslwhDYLhYHGkK32eOkq66tpd89a3J35Mz5QI5JE6B3TuTAvpvVy7MKvSLTFq6RDvoN9X4WVA/s72-c/pyramid.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>