Syfte: att öva dynamisk minnesallokering och aggregat
Senaste inlämningsdag: 2007 03 20
Bonus på tentamen: ½p
Uppgift
En polygon kan beskrivas som en följd av punkter i planet. Punkterna utgör hörnen (eng. vertex, vertices) i polygonen. Skriv klasserna Vertex och Polygon som innehåller minst följande:
* Klassen Vertex:
o Attribut: position i planet (x och y)
o Lämplig(a) konstruktor(er)
o Destruktor
* Klassen Polygon
o Attribut: en dynamiskt allokerad array av Vertex
o Konstruktor: tar en array av Vertex som parameter
o Destruktor
o Metod: add( Vertex ) - lägger till ett hörn
o Metod: area() - returnerar ytan av polygonen
o Metod: minx() - returnerar minsta x position
o Metod: maxx() - returnerar största x position
o Metod: miny() - returnerar minsta y position
o Metod: maxy() - returnerar största y position
o Metod: numVertices() - returnerar antalet hörn
Välj själv lämpliga typer på attribut och funktioner.
Dina klasser skall kunna användas som i programmet nedan:
#include <iostream>
using namespace std;
#include "vertex.h"
#include "polygon.h"
int main()
{
Vertex varr[] = { Vertex(0,0), Vertex(6,0),
Vertex(6,6), Vertex(0,6) };
Polygon pol( varr, 4 );
cout << "num: " << pol.numVertices() << endl;
cout << "yta: " << pol.area() << endl;
cout << "minx: " << pol.minx() << endl;
cout << "maxx: " << pol.maxx() << endl;
cout << "miny: " << pol.miny() << endl;
cout << "maxy: " << pol.maxy() << endl;
pol.add( Vertex(-1,3) );
cout << "num: " << pol.numVertices() << endl;
cout << "yta: " << pol.area() << endl;
cout << "minx: " << pol.minx() << endl;
Polygon pol1;
pol1.add( Vertex(0,0) );
pol1.add( Vertex(3,3) );
pol1.add( Vertex(3,0) );
cout << "triangelyta: " << pol1.area() << endl;
return 0;
}
Utskriften från programmet blir:
num: 4
yta: 36
minx: 0
maxx: 6
miny: 0
maxy: 6
num: 5
yta: 39
minx: -1
triangelyta: 4.5
Ytberäkning
Ytan av en polygon som beskrivs av ett antal hörn kan beräknas genom att summera uttrycket
(xi-xi-1) * (yi - (yi-yi-1)/2)
över samtliga hörn. Även
(x0-xn-1) * (y0 - (y0-yn-1)/2)
(där n är antal hörn) skall ingå.
Formeln ovan ger ett positivt värde om hörnen är ordnade medurs, ett negativt värde om de är ordnade moturs. Din metod skall naturligtvis returnera den korrekta ytan oavsett ordning.
Beskrivning av en polygon
Man kan förutsätta att hörnen anges (till Polygons konstruktor) i den ordning de skall ritas samt att metoden add() skall lägga till hörnet sist i arrayen. Tanken är at man skall kunna skapa polygoner endera genom att ange hörnen vid konstruktionen eller genom att anropa add() ett antal gånger.
Kommentar
Klassen Polygon är tänkt som en del av ett ritprogram, metoden add() används vid interaktiv konstruktion av en polygon.