
Klasa RegPolygon
Klasa opisująca wielokąt (wielobok) regularny. Dziedziczy po Figure.
Konstruktor
0 lub 3 argumenty.
var rpolygon = new RegPolygon(). Przyjmuje punkt Point P(0,0) stanowiący środek wielokąta, sides – liczba boków (wierzchołków) wielokąta = 0, r – promień okręgu opisanego na wielokącie = 0.0.
var rpolygon = new RegPolygon(new Point(x,y), sides, r). Przyjmuje punkt Point stanowiący środek wielokąta, sides – liczba boków (wierzchołków) wielokąta, r – promień okręgu opisanego na wielokącie.
Właściwości
| Właściwość | Opis | Wartość lub klasa obiektu | Wartość domyślna |
|---|---|---|---|
| points | tablica zawierająca punkty Point będącewierzchołkami wielokąta. Punkty wyznaczane są przez algorytm, chyba, że konstruktor jest wywołany bez argumentów. |
Array |
[] |
| center | punkt Point wyznaczający środek wielokąta
|
Point |
– |
| sides | liczba boków/wierzchołków wielokąta | liczba całkowita | – |
| r | promień okręgu opisanego na wielokącie | liczba rzeczywista | – |
Funkcje
| Typ zwracany | Nazwa | Opis | Przykład |
|---|---|---|---|
| liczba rzeczywista | area() |
Oblicza i zwraca pole powierzchni tego wielokąta. | Rysowanie wielokąta regularnego |
IrregPolygon |
deepclone() |
Tworzy głęboką kopię tego wielokąta. | |
Point |
barycenter() |
Zwraca punkt Point będący środkiem (ciężkości)tego wielokąta. |
|
| liczba rzeczywista | perimeter() |
Oblicza i zwraca obwód tego wielokąta. | |
void |
draw(context) |
Odrysowuje ten wielokąt na kontekście contextpodanym jako argument. |
Listing
var RegPolygon = function() {
this.points = [];
var len = arguments.length;
if (len == 3) {
this.center = new Point(arguments[0].x, arguments[0].y)
this.sides = arguments[1];// liczba boków
this.r = arguments[2];// promień
this.points[0] = new Point(arguments[0].x + this.r, arguments[0].y);
for (var i = 1; i < this.sides; i++) {
this.points[i] = new Point(arguments[0].x + this.r
* Math.cos(i * 2 * Math.PI / this.sides), arguments[0].y
+ this.r * Math.sin(i * 2 * Math.PI / this.sides));
}
}
};
RegPolygon.prototype = new Figure();
RegPolygon.prototype.area = function() {
var area = 0.0;
var a = distance(this.points[0], this.points[1]);
var ka = a * a;
switch (this.sides) {
case 3:
area = Math.sqrt(3) / 4.0 * ka;
break;
case 4:
area = ka;
break;
case 5:
area = Math.sqrt(25 + 10 * Math.sqrt(5)) / 4 * ka;
break;
case 6:
area = 3 * Math.sqrt(3) / 2 * ka;
break;
case 7:
area = 3.6339 * ka;
break;
case 8:
area = 2(1 + Math.sqrt(2)) * ka;
break;
case 9:
area = 6.1818 * ka;
break;
case 10:
area = 5 * Math.sqrt(25 + 10 * Math.sqrt(5)) / 2 * ka;
break;
case 12:
area = 3 * (2 + Math.sqrt(3)) * ka;
break;
default:
area = this.sides / 4
* (Math.cos(Math.PI / sides) / Math.sin(Math.PI / sides)) * ka;
break;
}
return area;
};
RegPolygon.prototype.deepclone = function() {
var figure = new RegPolygon();
figure.globalAlpha = this.globalAplpha;
figure.globalCompositeOperation = this.globalCompositeOperation;
figure.strokeStyle = this.strokeStyle;
figure.fillStyle = this.fillStyle;
figure.shadowOffsetX = this.shadowOffsetX;
figure.shadowOffsetY = this.shadowOffsetY;
figure.shadowBlur = this.shadowBlur;
figure.shadowColor = this.shadowColor;
figure.lineWidth = this.lineWidth;
figure.lineCap = this.lineCap;
figure.lineJoin = this.lineJoin;
figure.miterLimit = this.miterLimit;
figure.lineDashOffset = this.lineDashOffset;
figure.lineDashSegments = [];
for (var i = 0; i < this.lineDashSegments.length; i++) {
figure.lineDashSegments[i] = this.lineDashSegments[i];
}
figure.fill = this.fill;
figure.stroke = this.stroke;
figure.points = [];
for (var i = 0; i < this.points.length; i++) {
figure.points[i] = new Point(this.points[i].x, this.points[i].y);
}
figure.center = this.center;
figure.sides = this.sides;
figure.r = this.r;
return figure;
};
RegPolygon.prototype.barycenter = function() {
return new Point(this.center.x, this.center.y);
};
RegPolygon.prototype.perimeter = function(){
var dist = distance(this.points[0], this.points[1]);
return dist * this.sides;
};
RegPolygon.prototype.draw = function(context) {
context.save();
context.beginPath();
this.setProps(context);
context.moveTo(this.points[0].x, this.points[0].y);
for (var i = 1; i < this.sides; i++) {
context.lineTo(this.points[i].x, this.points[i].y);
}
context.closePath();
if (this.stroke == true) {
context.stroke();
}
if (this.fill == true) {
context.fill();
}
context.restore();
};
