Решение 6 задачи (с применением формулы Герона)
Primary tabs
Дано: координаты (x,y) четырех точек: A,B,C,D.
Нужно: проверить чем является этот фигура и посчитать её площадь
Решение:
Проверим сначала на выпуклость данный четырехугольник.
Если провести через две любые противоположные точки прямую, а две другие точки расположены в разных полуплоскостях относительно этой прямой, то этот четырехугольник выпуклый.
Доказали, что фигура является выпуклым четырёхугольником, теперь посчитаем её площадь.
Любой выпуклый четырехугольник, состоит из двух треугольников стороны которых мы можем посчитать. Отсюда следует, что мы можем по теореме Герона, посчитать их площади, а потом их cложить и получить площадь выпуклого четырехугольника.
Длины сторон 1 треугольника:
CA =$\sqrt[2]{ (x_3+ x_1)^2+(y_3+ y_1)^2}$
AB =$\sqrt[2]{ (x_2+ x_1)^2+(y_2+ y_1)^2}$
BC =$\sqrt[2]{ (x_3+ x_1)^2+(y_3+y_2)^2}$
Полупериметр 1 треугольника p:
$p= (AC+AB+BC)/2 $
Длины сторон 2 треугольник:
DA =$\sqrt[2]{ (x_4+ x_1)^2+(y_3+ y_1)^2}$
DC =$\sqrt[2]{ (x_4+ x_3)^2+(y_4+ y_3)^2}$
AC =$\sqrt[2]{ (x_3+ x_1)^2+(y_3+ y_1)^2}$
Полупериметр 2 треугольника p:
$p= (DA+DC+AC/2 $
После чего посчитаем площадь нашего выпуклого четырёхугольника:
$S_1+S_2=\sqrt[2]{ p*(p-DA)*(p-DC)*(p-AC)}+ \sqrt[2]{ p(p-AC)*(p-AB)*(p-BC)}$
Код задачи:
<?php class Point { public $x; public $y; function __construct($x, $y) { $this->x = $x; $this->y = $y; } function distance(Point $point) { return sqrt(pow($this-> x-$point-> x,2 )+pow( $this-> y - $point-> y, 2)); } } class Trapezoid { public $AB; public $BC; public $CD; public $DA; public $h; public $perimetr; public $s; // public function __construct($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4) { $A = new Point($x1, $y1); $B = new Point($x2, $y2); $C = new Point($x3, $y3); $D = new Point($x4, $y4); $this->AB = $A->distance($B); $this->BC = $B->distance($C); $this->CD = $C->distance($D); $this->DA = $D->distance($A); $this->BD = $B->distance($D); $this->CA = $C->distance($A); echo " AB ".$this->AB."<BR>"; echo " BC ".$this->BC."<BR>"; echo " CD ".$this->CD."<BR>"; echo " AC ".$this->CA."<BR>"; echo " BD ".$this->BD."<BR>"; echo " DA ".$this->DA."<BR>"; $this->p1 = ($this->AB+$this->CA+$this->BC )/2; $this->p2 = ($this->DA+$this->CA+$this->CD )/2; $this->S1 = sqrt ($this->p1*($this->p1-$this->AB)*($this->p1-$this->BC)*($this->p1-$this->CA)); echo "S1 ".$this->S1."<BR>"; $this->S2 = sqrt ($this->p2*($this->p2-$this->DA)*($this->p1-$this->CD)*($this->p1-$this->CA)); echo "S2 ".$this->S2."<BR>"; } function isEquilateral() : bool { return ( ($this->AB == $this->DC) and ($B->y == $C->y) and ($A->y ==$D->y)); } function getSquare() { $this->s = $this->S1+$this->S2; return $this->s; } function getPerimeter() { $this->perimetr = $this->AB + $this->BC + $this->CD + $this->DA; return $this->perimetr; } } class MethodsOfTrapezoid { public static $sumSquare; public static $averSquare; public static $quantity = 0; public static function CreateTrapezoids($n) { for ($i = 0; $i < $n; $i++) { $trapecia[$i] = new Trapezoid(0,0,2,2,4,2,5,0); self::$sumSquare += $trapecia[$i]->getSquare(); } return $trapecia; } public static function QuantityCalc($n, $trapecia) { self::$averSquare = self::$sumSquare / $n; for ($i = 0 ; $i < $n; $i++) { if($trapecia[$i]->getSquare() > self::$averSquare) { self::$quantity++; } } } public static function Show($n,$trapecia) { for($i = 0; $i < $n; $i++) { echo "_____________________".$i." Trapezoid_______"."\n"."\n"; echo "Square of trapezoid " . $i ." : ".$trapecia[$i]->getSquare() . "\n<BR>"; echo "Perimeter of trapezoid " . $i ." : ".$trapecia[$i]->getPerimeter() . "\n<BR>"; if ($trapecia[$i]->isEquilateral()) { echo "trapezoid " . $i . " is equilateral \n<BR>"; } else { echo "trapezoid " . $i . " is UNequilateral \n<BR>"; } } echo "average Square: ".self::$averSquare . "\n<BR>"; echo "Quantity of trapezoids which square more then average Square: ".self::$quantity . "\n<BR>"; } } $massTrapezoid = MethodsOfTrapezoid::CreateTrapezoids(4); MethodsOfTrapezoid::QuantityCalc(4, $massTrapezoid); MethodsOfTrapezoid::Show(4, $massTrapezoid);
- Log in to post comments
- 1490 reads