
Klasa IrregPolygon
Klasa opisująca wielokąt (wielobok) nieregularny. Dziedziczy po Figure.
Konstruktor
0, 1 albo wiele argumentów.
var ipolygon = new IrregPolygon(); . Tworzy wielokąt zerowy zawierający jeden punkt Point P(0,0) . Tworzy wielokąt na bazie tego punktu.
var ipolygon = new IrregPolygon(new Array(new Point(x1,y1), new Point(x2,y2), new Point(x3,y3), new Point(x4,y4))). Przyjmuje tablicę zawierającą pewną liczbę punktów Point. Tworzy wielokąt na bazie tych punktów.
var ipolygon = new Rectangle(new Point(x1,y1), new Point(x2,y2), new Point(x3,y3), new Point(x4,y4)). Tworzy tablicę punktów narożnikowych. Tworzy wielokąt na bazie tych punktów.
Właściwości
| Właściwość | Opis | Wartość lub klasa obiektu | Wartość domyślna |
|---|---|---|---|
| points | tablica zawierająca cztery punkty Pointtworzące ten prostokąt |
Array |
[] |
Funkcje
| Typ zwracany | Nazwa | Opis | Przykład |
|---|---|---|---|
| liczba rzeczywista | area() |
Oblicza i zwraca pole powierzchni tegowielokąta. | Rysowanie wielokąta nieregularnego Rysowanie wielokąta nieregularnego (2) Obliczanie punktu ciężkości wielokąta nieregularnego |
| liczba rzeczywista | perimeter() |
Oblicza i zwraca obwód tego wielokąta.. | |
IrregPolygon |
deepclone() |
Tworzy głęboką kopię tego wielokąta. | |
Point |
barycenter() |
Zwraca punkt Point będący środkiem (ciężkości)tego wielokąta. |
|
void |
draw(context) |
Odrysowuje ten wielokąt na kontekście contextpodanym jako argument. |
Listing
var IrregPolygon = function() {
this.points = [];
var len = arguments.length;
if (len == 1) {
for (var i = 0; i < arguments[0].length; i++) {
this.points[i] = new Point(arguments[0][i].x, arguments[0][i].y);
}
} else {
for (var i = 0; i < len; i++) {
this.points[i] = new Point(arguments[i].x, arguments[i].y);
}
}
};
IrregPolygon.prototype = new Figure();
IrregPolygon.prototype.deepclone = function() {
var figure = new IrregPolygon();
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);
}
return figure;
};
IrregPolygon.prototype.barycenter = function() {
var cv1 = document.getElementById("testcanvas");
var ctx1 = cv1.getContext("2d");
var w = cv1.width;
var h = cv1.height;
var barray = this.deepclone();
var len = barray.points.length;
barray.draw(ctx1);
var last;
var triangle;
var segment;
var centrum;
var area = 0.0;
var areax = 0.0
var areay = 0.0;
while (len > 2) {
last = len - 1;
triangle = new Triangle(barray.points[0], barray.points[1],
barray.points[last]);
segment = new Segment(barray.points[1], barray.points[last]);
centrum = segment.barycenter();
if (ctx1.isPointInPath(centrum.x, centrum.y)) {
var arear = triangle.area();
area += arear;
var bary = triangle.barycenter();
areax += (bary.x * arear);
areay += (bary.y * arear);
barray.points.shift();
len = barray.points.length;
} else {
triangle = new Triangle(barray.points[last], barray.points[0],
barray.points[last - 1]);
segment = new Segment(barray.points[0], barray.points[last - 1]);
centrum = segment.barycenter();
var arear = triangle.area();
area += arear;
var bary = triangle.barycenter();
areax += (bary.x * arear);
areay += (bary.y * arear);
barray.points.pop();
len = barray.points.length;
}
}
return new Point(areax / area, areay / area);
};
IrregPolygon.prototype.area = function() {
var cv1 = document.getElementById("testcanvas");
var ctx1 = cv1.getContext("2d");
var w = cv1.width;
var h = cv1.height;
var barray = this.deepclone();
var len = barray.points.length;
barray.draw(ctx1);
var last;
var triangle;
var segment;
var centrum;
var area = 0.0;
while (len > 2) {
last = len - 1;
triangle = new Triangle(barray.points[0], barray.points[1],
barray.points[last]);
segment = new Segment(barray.points[1], barray.points[last]);
centrum = segment.barycenter();
if (ctx1.isPointInPath(centrum.x, centrum.y)) {
var arear = triangle.area();
area += arear;
barray.points.shift();
len = barray.points.length;
} else {
triangle = new Triangle(barray.points[last], barray.points[0],
barray.points[last - 1]);
segment = new Segment(barray.points[0], barray.points[last - 1]);
var arear = triangle.area();
area += arear;
barray.points.pop();
len = barray.points.length;
}
}
return area;
};
IrregPolygon.prototype.perimeter = function() {
var len = this.points.length;
var perimeter = distance(this.points[len - 1], this.points[0]);
for (var i = 0; i < len - 1; i++) {
perimeter += distance(this.points[i], this.points[i + 1]);
}
return perimeter;
};
IrregPolygon.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.points.length; 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();
};
