Wymaga dodania skryptu figures.js, który znajduje się tutaj:
Skrypty JavaScript do części 2

Klasa IrregPolygon

Klasa opisująca wielokąt (wielobok) nieregularny. Dziedziczy po code>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ści
Właściwość Opis Wartość lub klasa obiektu Wartość
domyślna
points tablica zawierająca cztery punkty Point
tworzące ten prostokąt
Array []

Funkcje

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 context
podanym 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();
};
            

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *