Опубликован: 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;
}
}