Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
pub:labprog:20181022 [2018/10/23 00:20] lucafavalli |
pub:labprog:20181022 [2018/10/24 13:02] (current) lucafavalli |
||
---|---|---|---|
Line 629: | Line 629: | ||
(ogni coppia di punti identifica i vertici opposti di un rettangolo), | (ogni coppia di punti identifica i vertici opposti di un rettangolo), | ||
restituisca in output l'area della sovrapposizione tra i due rettangoli. | restituisca in output l'area della sovrapposizione tra i due rettangoli. | ||
- | |||
- | (NOTA: la funzione between è inserita solo per comodità di lettura: | ||
- | ogni istanza del tipo: | ||
- | |||
- | between(x, y, z) | ||
- | |||
- | può essere sostituita dallo statement | ||
- | |||
- | y <= x && x <= z | ||
- | |||
- | L'utilizzo delle funzioni non è quindi propedeutico allo svolgimento dell'esercizio) | ||
*/ | */ | ||
Line 658: | Line 647: | ||
var ax, ay, cx, cy float64 | var ax, ay, cx, cy float64 | ||
var a1x, a1y, c1x, c1y float64 | var a1x, a1y, c1x, c1y float64 | ||
- | |||
- | var a, b, c, d bool | ||
- | var a1, b1, c1, d1 bool | ||
var area float64 | var area float64 | ||
Line 666: | Line 652: | ||
fmt.Scan(&ax, &ay, &cx, &cy, &a1x, &a1y, &c1x, &c1y) | fmt.Scan(&ax, &ay, &cx, &cy, &a1x, &a1y, &c1x, &c1y) | ||
- | //Punto A in A1 B1 C1 D1 | + | //Se i due rettangoli non si sovrappongono l'area è 0 |
- | a = between(ax, a1x, c1x) && between(ay, a1y, c1y) | + | if cx <= a1x || ax >= c1x || cy <= a1y || ay >= c1y { |
- | //Punto B in A1 B1 C1 D1 | + | area = 0 |
- | b = between(cx, a1x, c1x) && between(ay, a1y, c1y) | + | } else { |
- | //Punto C in A1 B1 C1 D1 | + | //Esiste almeno una sovrapposizione e tale sovrapposizione corrisponde ai due valori centrali |
- | c = between(cx, a1x, c1x) && between(cy, a1y, c1y) | + | var x1, x2, y1, y2 float64 |
- | //Punto D in A1 B1 C1 D1 | + | x1 = ax |
- | d = between(ax, a1x, c1x) && between(cy, a1y, c1y) | + | x2 = cx |
- | + | if a1x > ax { | |
- | + | x1 = a1x | |
- | //Punto A1 in A B C D | + | } |
- | a1 = between(a1x, ax, cx) && between(a1y, ay, cy) | + | if c1x < cx { |
- | //Punto B1 in A B C D | + | x2 = c1x |
- | b1 = between(c1x, ax, cx) && between(a1y, ay, cy) | + | } |
- | //Punto C1 in A B C D | + | |
- | c1 = between(c1x, ax, cx) && between(c1y, ay, cy) | + | |
- | //Punto D1 in A B C D | + | |
- | d1 = between(a1x, ax, cx) && between(c1y, ay, cy) | + | |
- | + | ||
- | if (a || b || c || d) { | + | |
- | if a { | + | |
- | if c { | + | |
- | /* | + | |
- | D1-----------C1 | + | |
- | | D-----C | | + | |
- | | | | | | + | |
- | | A-----B | | + | |
- | A1-----------B1 | + | |
- | + | ||
- | Copre i casi: | + | |
- | - a & c | + | |
- | - b & d | + | |
- | */ | + | |
- | area = (cx - ax) * (cy - ay) | + | |
- | } else if b { | + | |
- | /* | + | |
- | D-----C | + | |
- | | | | + | |
- | D1---+-----+-C1 | + | |
- | | | | | | + | |
- | | | | | | + | |
- | | A-----B | | + | |
- | A1-----------B1 | + | |
- | + | ||
- | Copre i casi: | + | |
- | - a & b | + | |
- | */ | + | |
- | area = (cx - ax) * (c1y - ay) | + | |
- | } else if d { | + | |
- | /* | + | |
- | D1-----------C1 | + | |
- | | D--------+--C | + | |
- | | | | | | + | |
- | | A--------+--B | + | |
- | A1-----------B1 | + | |
- | + | ||
- | Copre i casi: | + | |
- | - a & d | + | |
- | + | ||
- | */ | + | |
- | area = (c1x - ax) * (cy - ay) | + | |
- | } else { | + | |
- | /* | + | |
- | D-----------C | + | |
- | D1---+-------C1 | | + | |
- | | | | | | + | |
- | | | | | | + | |
- | | A--------+--B | + | |
- | A1-----------B1 | + | |
- | Copre i casi: | + | |
- | - a | + | |
- | - c1 | + | |
- | */ | + | |
- | area = (c1x - ax) * (c1y - ay) | + | |
- | } | + | |
- | } else if b { | + | |
- | //b & d e b & a sono già coperti | + | |
- | if c { | + | |
- | /* | + | |
- | D1-----------C1 | + | |
- | D--+---------C | | + | |
- | | | | | | + | |
- | A--+---------B | | + | |
- | A1-----------B1 | + | |
- | + | ||
- | Copre i casi: | + | |
- | - b & c | + | |
- | */ | + | |
- | area = (cx - a1x) * (cy - ay) | + | |
- | } else { | + | |
- | /* | + | |
- | D------------C | + | |
- | | D1---------+-C1 | + | |
- | | | | | | + | |
- | | | | | | + | |
- | A--+---------B | | + | |
- | A1-----------B1 | + | |
- | + | ||
- | Copre i casi: | + | |
- | - b | + | |
- | - d1 | + | |
- | */ | + | |
- | area = (cx - a1x) * (c1y - ay) | + | |
- | } | + | |
- | } else if c { | + | |
- | //a & c e b & c sono già coperti | + | |
- | if d { | + | |
- | /* | + | |
- | D1-----------C1 | + | |
- | | | | + | |
- | | | | + | |
- | | D-----C | | + | |
- | A1---+-----+-B1 | + | |
- | | | | + | |
- | | | | + | |
- | A-----B | + | |
- | Copre i casi: | + | |
- | - c & d | + | |
- | */ | + | |
- | area = (cx - ax) * (cy - a1y) | + | |
- | } else { | + | |
- | /* | + | |
- | D1-----------C1 | + | |
- | | | | + | |
- | | | | + | |
- | D-+---C | | + | |
- | | A1--+--------B1 | + | |
- | | | | + | |
- | | | | + | |
- | A-----B | + | |
- | Copre i casi: | + | |
- | - c | + | |
- | - a1 | + | |
- | */ | + | |
- | area = (cx - a1x) * (cy - a1y) | + | |
- | } | + | |
- | } else { | + | |
- | /* | + | |
- | D1---+-----+-C1 | + | |
- | | | | + | |
- | | | | + | |
- | | D--------+--C | + | |
- | A1---+-------B1 | | + | |
- | | | | + | |
- | | | | + | |
- | A-----------B | + | |
- | Copre i casi: | + | y1 = ay |
- | - d | + | y2 = cy |
- | - b1 | + | if a1y > ay { |
- | */ | + | y1 = a1y |
- | area = (c1x - ax) * (cy - a1y) | + | |
} | } | ||
- | } else if (a1 || b1 || c1 || d1) { | + | if c1y< cy { |
- | //Analogo scambiando i rettangoli | + | y2 = c1y |
- | if a1 { | + | |
- | if c1 { | + | |
- | area = (c1x - a1x) * (c1y - a1y) | + | |
- | } else if b1 { | + | |
- | area = (c1x - a1x) * (cy - a1y) | + | |
- | } else if d1 { | + | |
- | area = (cx - a1x) * (c1y - a1y) | + | |
- | } | + | |
- | //a1 è già coperto | + | |
- | } else if b1 && c1 { | + | |
- | area = (c1x - ax) * (c1y - a1y) | + | |
- | //b1 è già coperto | + | |
- | } else if c1 && d1 { | + | |
- | area = (c1x - a1x) * (c1y - ay) | + | |
- | //c1 è già coperto | + | |
} | } | ||
- | } else if ( | + | area = (x2 - x1) * (y2 - y1) |
- | between(ax, a1x, c1x) && | + | |
- | between(cx, a1x, c1x) && | + | |
- | a1x < ax && c1x > cx && | + | |
- | between(a1y, ay, cy) && | + | |
- | between(c1y, ay, cy) && | + | |
- | ay < a1y && cy > c1y) { | + | |
- | /* | + | |
- | D-----C | + | |
- | | | | + | |
- | D1---+-----+---C1 | + | |
- | | | | | | + | |
- | | | | | | + | |
- | | | | | | + | |
- | A1---+-----+---B1 | + | |
- | | | | + | |
- | A-----B | + | |
- | */ | + | |
- | area = (cx - ax) * (c1y - a1y) | + | |
- | } else if ( //Inverso | + | |
- | between(a1x, ax, cx) && | + | |
- | between(c1x, ax, cx) && | + | |
- | ax < a1x && cx > c1x && | + | |
- | between(ay, a1y, c1y) && | + | |
- | between(cy, a1y, c1y) && | + | |
- | a1y < ay && c1y > cy){ | + | |
- | area = (c1x - a1x) * (cy - ay) | + | |
- | } else { //Nessuna sovrapposizione | + | |
- | area = 0 | + | |
} | } | ||
fmt.Println("La sovrapposizione è", area) | fmt.Println("La sovrapposizione è", area) | ||
} | } | ||
- | func between (intValue, lowerLimit, upperLimit float64) bool { | ||
- | return lowerLimit <= intValue && intValue <= upperLimit | ||
- | } | ||
</code> | </code> |