Опубликован: 27.09.2006 | Уровень: для всех | Доступ: платный | ВУЗ: Московский государственный индустриальный университет
Лекция 13:
Изображение полиэдра
Polyedr.java
import java.util.*; import java.io.*; /** * @author Е.А. Роганов * @version 1.1 * Класс Polyedr, реализующий полиэдр. */ public class Polyedr { /** * Массив вершин полиэдра. */ private Vertex[] vertexes; /** * Массив ребер полиэдра. */ private Edge[] edges; /** * Массив граней полиэдра. */ private Facet[] facets; /** * Конструктор класса. * @param file Файл, содержащий описание полиэдра. * @exception Exception Исключительная ситуация, возникающая при * ошибках чтения или преобразования данных. */ public Polyedr(String file) throws Exception { RandomAccessFile f = new RandomAccessFile(file, "r"); StringTokenizer st = new StringTokenizer(f.readLine()); vertexes = new Vertex[Integer.parseInt(st.nextToken())]; facets = new Facet[Integer.parseInt(st.nextToken())]; edges = new Edge[Integer.parseInt(st.nextToken())]; for (int i=0; i<vertexes.length; i++) { st = new StringTokenizer(f.readLine()); double x = Double.valueOf(st.nextToken()).doubleValue(); double y = Double.valueOf(st.nextToken()).doubleValue(); double z = Double.valueOf(st.nextToken()).doubleValue(); vertexes[i] = new Vertex(x,y,z); } int k = 0; for (int i=0; i<facets.length; i++) { st = new StringTokenizer(f.readLine()); int size = Integer.parseInt(st.nextToken()); Vertex[] facet = new Vertex[size]; facet[0] = vertexes[Integer.parseInt(st.nextToken()) - 1]; for (int j=1; j<size; j+=1) { facet[j] = vertexes[Integer.parseInt(st.nextToken()) - 1]; edges[k++] = new Edge(facet[j], facet[j-1]); } edges[k++] = new Edge(facet[size-1], facet[0]); facets[i] = new Facet(facet); } } /** * Получить количество вершин. * @return Количество вершин полиэдра. */ public final int getVertexesQuantity() { return vertexes.length; } /** * Получить вершину. * @param i Номер вершины. * @return Вершина полиэдра. */ public final Vertex getVertex(int i) { return vertexes[i]; } /** * Получить количество ребер. * @return Количество ребер полиэдра. */ public final int getEdgesQuantity() { return edges.length; } /** * Получить ребро. * @param i Номер ребра. * @return Ребро полиэдра. */ public final Edge getEdge(int i) { return edges[i]; } /** * Получить количество граней. * @return Количество граней полиэдра. */ public final int getFacetsQuantity() { return facets.length; } /** * Получить грань. * @param i Номер грани. * @return Грань полиэдра. */ public final Facet getFacet(int i) { return facets[i]; } }
Segment.java
/** * @author Е.А. Роганов * @version 1.q * Класс Segment, реализующий одномерный отрезок. */ public class Segment { /** * Координаты начала и конца отрезка. */ private double begin, end; /** * Конструктор отрезка. * @param begin Начало отрезка. * @param end Начало отрезка. */ public Segment(double begin, double end) { this.begin = begin; this.end = end; } /** * Вырожден ли отрезок? * @return Вырожден ли отрезок? */ public final boolean degenerate() { return begin >= end; } /** * Найти левый отрезок разности с отрезком s. * @param s Вычитаемый отрезок. * @return Левый отрезок разности. */ public final Segment leftSub(Segment s) { return new Segment(begin, Math.min(end, s.begin)); } /** * Найти правый отрезок разности с отрезком s. * @param s Вычитаемый отрезок. * @return Правый отрезок разности. */ public final Segment rightSub(Segment s) { return new Segment(Math.max(begin, s.end), end); } /** * Найти пересечение с отрезком s. * @param s Отрезок, с которым находится пересечение. * @return Отрезок-пересечение. */ public final Segment intersection(Segment s) { begin = Math.max(begin, s.begin); end = Math.min(end, s.end); return this; } /** * Получить начало отрезка. * @return Начало отрезка. */ public final double getBegin() { return begin; } /** * Получить конец отрезка. * @return Конец отрезка. */ public final double getEnd() { return end; } }