Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- using namespace std;
- // Punkt.
- struct point
- {
- // Wspó³rzêdna x.
- double x;
- // Wspó³rzêdna y.
- double y;
- // Id odcinka, do którego nale¿y punkt.
- int segment_id;
- // Czy lewy kraniec odcinka.
- bool left;
- bool operator < (const point &other) const
- {
- return x < other.x;
- }
- };
- // Odcinek.
- struct segment
- {
- // Id odcinka.
- int id;
- // Punkt 1.
- point p1;
- // Punkt 2.
- point p2;
- double get_left_y;
- bool operator < (const segment &other) const
- {
- return get_left_y < other.get_left_y;
- }
- /*
- // Zwraca wspó³rzêdn¹ y lewego krañca.
- double get_left_y() const
- {
- return (p1.x < p2.x) ? p1.y : p2.y;
- }
- */
- };
- // Dodanie odcinka do zbioru.
- void add(segment t[], int t_count, segment seg)
- {
- t[t_count] = seg;
- sort(t, t + t_count);
- }
- // Utworzenie zbioru punktów.
- void get_points(segment segments[], int segment_count, point points[])
- {
- int i;
- for (i = 0; i < segment_count; i++) {
- points[2 * i] = segments[i].p1;
- points[2 * i + 1] = segments[i].p2;
- }
- }
- // Pobranie iloœci odcinków od u¿ytkownika.
- void get_segment_count(int &segment_count)
- {
- segment_count = 6;
- }
- // Pobranie wspó³rzêdnych odcinków od u¿ytkownika.
- void get_segments(segment segments[])
- {
- segments[0].id = 0;
- segments[0].p1.segment_id = 0;
- segments[0].p2.segment_id = 0;
- segments[0].p1.x = 1;
- segments[0].p1.y = 4;
- segments[0].p2.x = 5;
- segments[0].p2.y = 3;
- segments[0].p1.left = (segments[0].p1.x < segments[0].p2.x) ? true : false;
- segments[0].p2.left = (segments[0].p2.x < segments[0].p1.x) ? true : false;
- segments[0].get_left_y = (segments[0].p1.x < segments[0].p2.x) ? segments[0].p1.y : segments[0].p2.y;
- segments[1].id = 1;
- segments[1].p1.segment_id = 1;
- segments[1].p2.segment_id = 1;
- segments[1].p1.x = 2;
- segments[1].p1.y = 1;
- segments[1].p2.x = 10;
- segments[1].p2.y = 10;
- segments[1].p1.left = (segments[1].p1.x < segments[1].p2.x) ? true : false;
- segments[1].p2.left = (segments[1].p2.x < segments[1].p1.x) ? true : false;
- segments[1].get_left_y = (segments[1].p1.x < segments[1].p2.x) ? segments[1].p1.y : segments[1].p2.y;
- segments[2].id = 2;
- segments[2].p1.segment_id = 2;
- segments[2].p2.segment_id = 2;
- segments[2].p1.x = 3;
- segments[2].p1.y = 3;
- segments[2].p2.x = 4;
- segments[2].p2.y = 6;
- segments[2].p1.left = (segments[2].p1.x < segments[2].p2.x) ? true : false;
- segments[2].p2.left = (segments[2].p2.x < segments[2].p1.x) ? true : false;
- segments[2].get_left_y = (segments[2].p1.x < segments[2].p2.x) ? segments[2].p1.y : segments[2].p2.y;
- segments[3].id = 3;
- segments[3].p1.segment_id = 3;
- segments[3].p2.segment_id = 3;
- segments[3].p1.x = 4;
- segments[3].p1.y = 5;
- segments[3].p2.x = 2;
- segments[3].p2.y = 10;
- segments[3].p1.left = (segments[3].p1.x < segments[3].p2.x) ? true : false;
- segments[3].p2.left = (segments[3].p2.x < segments[3].p1.x) ? true : false;
- segments[3].get_left_y = (segments[3].p1.x < segments[3].p2.x) ? segments[3].p1.y : segments[3].p2.y;
- segments[4].id = 4;
- segments[4].p1.segment_id = 4;
- segments[4].p2.segment_id = 4;
- segments[4].p1.x = 5;
- segments[4].p1.y = 2;
- segments[4].p2.x = 4;
- segments[4].p2.y = 9;
- segments[4].p1.left = (segments[4].p1.x < segments[4].p2.x) ? true : false;
- segments[4].p2.left = (segments[4].p2.x < segments[4].p1.x) ? true : false;
- segments[4].get_left_y = (segments[4].p1.x < segments[4].p2.x) ? segments[4].p1.y : segments[4].p2.y;
- segments[5].id = 5;
- segments[5].p1.segment_id = 5;
- segments[5].p2.segment_id = 5;
- segments[5].p1.x = 6;
- segments[5].p1.y = 6;
- segments[5].p2.x = 5;
- segments[5].p2.y = 8;
- segments[5].p1.left = (segments[5].p1.x < segments[5].p2.x) ? true : false;
- segments[5].p2.left = (segments[5].p2.x < segments[5].p1.x) ? true : false;
- segments[5].get_left_y = (segments[5].p1.x < segments[5].p2.x) ? segments[5].p1.y : segments[5].p2.y;
- }
- // Pobranie wspó³rzêdnych odcinków od u¿ytkownika.
- int main()
- {
- // Iteratory;
- int i, j;
- // Iloœæ odcinków.
- int segment_count;
- // Pobranie iloœci odcinków od u¿ytkownika.
- get_segment_count(segment_count);
- // Odcinki.
- segment segments[segment_count];
- // Pobranie wspó³rzêdnych odcinków od u¿ytkownika.
- get_segments(segments);
- cout << "Ilosc odcinkow: " << endl << segment_count << endl << endl;
- cout << "Odcinki: " << endl;
- for (i = 0; i < segment_count; i++) {
- cout << segments[i].id << " | ";
- cout << "(" << segments[i].p1.x << ", " << segments[i].p1.y << ")";
- cout << " | ";
- cout << "(" << segments[i].p2.x << ", " << segments[i].p2.y << ")";
- cout << endl;
- }
- cout << endl;
- // Iloœæ punktów.
- int point_count = segment_count * 2;
- // Punkty.
- point points[point_count];
- // Utworzenie zbioru punktów.
- get_points(segments, segment_count, points);
- // Posortowanie zbioru punktów po wspó³rzêdnej x.
- sort(points, points + point_count);
- cout << "Punkty: " << endl;
- for (i = 0; i < point_count; i++) {
- cout << "(" << points[i].x << ", ";
- cout << points[i].y << ") | ";
- cout << "segment_id: " << points[i].segment_id << " | ";
- cout << "left: " << points[i].left << endl;
- }
- cout << endl;
- // Zbiór odcinków.
- segment t[segment_count];
- // Iloœæ odcinków w zbiorze.
- int t_count = 0;
- // Aktualnie sprawdzany odcinek.
- segment current_segment;
- for (i = 0; i < point_count; i++) {
- // Odciek, do którego nale¿y punkt.
- current_segment = segments[points[i].segment_id];
- if (points[i].left == true) {
- // Dodanie odcinka do zbioru.
- add(t, t_count, current_segment);
- t_count++;
- /*
- seg_prev = prev()
- seg_next = next()
- if (seg_prev != null) {
- czy_sie_przecinaja(current_segment, seg_prev)
- }
- if (seg_next != null) {
- czy_sie_przecinaja(current_segment, seg_next)
- }
- */
- } else {
- /*
- seg_prev = seg_prev
- seg_next = seg_next
- if (
- seg_prev != null
- && seg_next != null
- ) {
- czy_sie_przecinaja(seg_prev, seg_next)
- }
- delete(t, t_count, current_segment);
- t_count--;
- */
- }
- cout << "Zbior odcinkow: " << endl;
- for (j = 0; j < t_count; j++) {
- cout << t[j].id << " | ";
- cout << "(" << t[j].p1.x << ", " << t[j].p1.y << ")";
- cout << " | ";
- cout << "(" << t[j].p2.x << ", " << t[j].p2.y << ")";
- cout << endl;
- }
- cout << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement