< Zpět na seznam úloh

G2 Plocha mnohoúhelníka

var datasets = [
  {arg:[[0, 0], [1, 0], [0, 1]], out: 0.5},
  {arg:[[0, 0], [1, 0], [1, 1], [0, 1]], out: 1},
  {arg:[[0,0], [2,0], [3,1], [2,2], [0,2], [1,1]], out: 4},
  {arg:[[31.601669, 90.10987], [64.031362, 76.189357], [45.147682, 49.697925], [87.058644, 57.118908], [73.658353, 27.410992], [134.05109, 57.429373], [126.17374, 23.86042], [178.95235, 50.941155], [122.9789, 89.329986], [161.887, 98.664063], [124.8664, 123.08475], [92.140377, 76.356085], [60.822572, 104.06975]], out:5903.2937},
]

var names = ['vrcholy'];
function req(a, b) {
  return Math.round(a * 1000) == Math.round(b * 1000);
}

function validator(result, dataset) {
  return req(dataset.out, result);
}

Program dostává mnohoúhelník v rovině zapsaný jako seznam bodů. Každá dvojice sousedních bodů v seznamu je spojená úsečkou, stejně jako poslední bod s prvním. Body jsou zapsané v pořadí proti směru hodinových ručiček. Zadaný seznam obsahuje aspoň tři body.

Výstupem programu je plocha zadaného mnohoúhelníka.

Smíte používat modul numpy.

Rady

Dostáváte hotovou funkci plocha_trojuhelnika, která spočítá vektorový součin a vrátí polovinu jeho z-ové souřadnice.

Mnohoúhelník si potřebujeme nejdřív nakrájet na části, spočítat jejich plochu a tu sečíst. Nakreslené je to na Wikipedii: Shoelace formula.

Některé části nutně musejí mít zápornou plochu, aby to vycházelo správně.

import numpy as np

def plocha_trojuhelnika(a, b, c):
  m = b - a
  n = c - a
  return (m[0]*n[1] - m[1]*n[0]) / 2

def main(vrcholy):
  v = np.array(vrcholy)
  return plocha_trojuhelnika(v[0], v[1], v[2])