C++ :: Aufgabe #360

2 Lösungen Lösungen öffentlich

Schnittpunkt zweier Geraden endlicher Länge

Fortgeschrittener - C++ von hollst - 20.04.2021 um 10:25 Uhr
In der unendlich ausgedehnten euklidischen 2D-Eben wähle man zufällig vier unterschiedliche Punkte P1, P2, P3 und P4. Gedanklich verbinde man P1 und P2 mit einer geraden Linie L12 sowie P3 und P4 mit einer geraden Linie L34.

Man schreibe eine Funktion, die als Rückgabewert ausgibt, ob sich L12 und L34 schneiden in Abhändigkeit von den Anfangs-/Endpunkten P1 ... P4.

Viel Spaß!

Lösungen:

vote_ok
von JKooP (18090 Punkte) - 21.04.2021 um 20:53 Uhr
C++ 17
Lösung mittels Geradengleichung:
Quellcode ausblenden C-Code
#include <iostream>
#include "IntersectLine.h"

int main(){

    Point P1 { -4.5, 5.8 };
    Point P2 { 3.1, -2 };
    Point P3 { 4.5, 6.2 };
    Point P4 { -2.7, -7.8 };

    Line L12 { P1, P2 };
    Line L34 { P3, P4 };

    IntersectLine isl { L12, L34 };

    isl.print_result();
}

.h
Quellcode ausblenden C-Code
#pragma once
#include <iostream>

struct Point { double X, Y; };
struct Line { struct Point P1, P2; };

class IntersectLine
{
private:
    struct Line L1, L2;
    double get_xS();
    double get_yS();
public:
    IntersectLine(Line l1, Line l2) : L1{ l1 }, L2{ l2 } {}
    void print_result();
    bool is_intersect_line();
};

.cpp
Quellcode ausblenden C-Code
#include "IntersectLine.h"

// Geradengleichung 1: L12 = (yP2 - yP1) / (xP2 - xP1) * (x - xP1) + yP1;
// Geradengleichung 2: L34 = (yP4 - yP3) / (xP4 - xP3) * (x - xP3) + yP3;

// beide Geradengleichungen gleich setzen => xS:
double IntersectLine::get_xS()
{
    return (-L1.P2.X * L2.P1.X * L1.P1.Y + L1.P2.X * L2.P2.X * L1.P1.Y + L1.P1.X * L2.P1.X * L1.P2.Y
        - L1.P1.X * L2.P2.X * L1.P2.Y + L1.P1.X * L2.P2.X * L2.P1.Y - L1.P2.X * L2.P2.X * L2.P1.Y
        - L1.P1.X * L2.P1.X * L2.P2.Y + L1.P2.X * L2.P1.X * L2.P2.Y) /
        (-L2.P1.X * L1.P1.Y + L2.P2.X * L1.P1.Y + L2.P1.X * L1.P2.Y
            - L2.P2.X * L1.P2.Y + L1.P1.X * L2.P1.Y - L1.P2.X * L2.P1.Y
            - L1.P1.X * L2.P2.Y + L1.P2.X * L2.P2.Y);
}

// xS in die 2. Gleichung einsetzen => yS
double IntersectLine::get_yS()
{
    return (L2.P2.Y - L2.P1.Y) / (L2.P2.X - L2.P1.X) * (get_xS() - L2.P1.X) + L2.P1.Y;
}

void IntersectLine::print_result()
{
    if (is_intersect_line())
        std::cout << "Schnittpunkt: (" << get_xS() << ", " << get_yS() << ")" << std::endl;
    else
        std::cout << "Kein Schnittpunkt" << std::endl;
}

bool IntersectLine::is_intersect_line()
{
    return !(std::isnan(get_xS()) || std::isnan(get_yS()));
}

vote_ok
von Mahlnycdir (100 Punkte) - 08.05.2021 um 10:48 Uhr
Quellcode ausblenden C-Code
#include <iostream>

class P
{
    public:
        double x;
        int y;
};

class line
{
    public:
        double x;
        double y;
};

bool check(line l1, line l2)
{
    double k = l1.x / l2.x;
    if(l1.y * k == l2.y)
    {
        return false;
    }
    return true;
}

int main()
{
    P P1;
    P P2;
    P P3;
    P P4;

    line l12;
    l12.x = P2.x - P1.x;
    l12.y = P2.y - P1.y;

    line l34;
    l34.x = P4.x - P3.x;
    l34.y = P4.y - P3.y;

    std::cout << check(l12, l34);

    return 0;
}
1960409

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.