Strzałka C++ na funkcji liniowej

Strzałka C++ na funkcji liniowej
N7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Cześć, jestem początkujący a dostałem zadanie, z którym nie do końca mogę sobie poradzić. W zadaniu chodzi o to, aby wyznaczyć punkty D,E,F opisujące strzałkę skierowaną w stronę punktu B. Punkt D udało mi się wyznaczyć, ale dalej nie wiem co zrobić. Z góry dzięki za pomoc. Ramiona mają 1/5 długości promienia, a kąt alpha jest w przedziale od 0 do 45 stopni.
Kod:

Kopiuj
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int Ax,Ay,Bx,By,r,alpha;
    
    double Dx,Dy
    
    std::cout << "Podaj koordynaty punktu A" << std::endl;
    cout<<"Podaj x=";
    std::cin >>Ax;
    cout<<"Podaj y=";
    cin>>Ay;
    
    std::cout << "Podaj koordynaty punktu B" << std::endl;
    cout<<"Podaj x=";
    std::cin >>Bx;
    cout<<"Podaj y=";
    cin>>By;
    
    
    cout<<"Podaj promień okręgu:";
    cin>>r;
    
    cout<<"Wprowadź kąt alpha od 10' do 45': ";
    cin>>alpha;
    
    // Różnice współrzędnych
    int Rx = Bx - Ax;
    int Ry = By - Ay;
    
    //Długość między A i B
    double lenght = sqrt(Rx*Rx+Ry*Ry);
    
    //Wektor jednostkowy
    double Wjx = Rx/lenght;
    double Wjy = Ry/lenght;
    
    cout<<"wjx: "<<Wjx<<endl;
    cout<<"wjy: "<<Wjy<<endl;
    
    //Współrzędne D
    Dx = Ax + r*Wjx;
    Dy = Ay + r*Wjy;
    
    cout<<"Współrzędne D=("<<Dx<<","<<Dy<<")"<<endl;   
}

Strzałka.PNG

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5025
0

A ten kąt alfa to między cxym a czym?

N7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0
lion137 napisał(a):

A ten kąt alfa to między cxym a czym?

Przechwytywanie.PNG

LukeJL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8488
1

możesz też użyć funkcji atan2(y, x), gdzie podajesz relatywne współrzędne y i x (między A i B) i zwraca ci kąt, nazwijmy go beta
dalej możesz pojechać wg wzoru:
Dx = Ax + cos(beta) * radius
Dy = Ay + sin(beta) * radius
żeby znaleźć punkt D (chociaż juz go znalazłeś innym sposobem)

jednak mając punkt D możesz potraktować go jako środek koła i znaleźć końce strzałki podobnym sposobem (że cosinus z kąta pomnożony przez promień to współrzędna x, a sinus z kąta pomnożony przez promień to współrzędna y). Wtedy zastanawiasz się, pod jakim kątem musisz "odjechać" z punktu D, żeby znaleźć jeden i drugi koniec strzałki. A promień to długość strzałki.

tutaj masz rozrysowane, jaka jest zależność między okręgiem o sinusem i cosinusem: https://www.mathsisfun.com/geometry/unit-circle.html

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
2

Najlepiej zacząć od zdefiniowania sobie algebry 2D, a potem z niej skorzystać:

Kopiuj
struct Vec {
    double x;
    double y;
};

Vec operator*(const Vec& a, double b)
{
    return { a.x * b, a.y * b };
}

Vec operator/(const Vec& a, double b)
{
    return { a.x / b, a.y / b };
}

Vec operator*(double b, const Vec& a)
{
    return a * b;
}

Vec diff(const Vec& a, const Vec& b)
{
    return { a.x - b.x, a.y - b.y };
}

Vec add(const Vec& a, const Vec& b)
{
    return { a.x + b.x, a.y + b.y };
}

Vec operator+(const Vec& a, const Vec& b)
{
    return add(a, b);
}

Vec operator-(const Vec& a, const Vec& b)
{
    return diff(a, b);
}

double dotProduct(const Vec& a, const Vec& b)
{
    return a.x * b.x + a.y * b.y;
}

double crossProduct(const Vec& a, const Vec& b)
{
    return a.x * b.y - a.y * b.x;
};

double operator*(const Vec& a, const Vec& b)
{
    return dotProduct(a, b);
}

struct ArrowData {
    Vec begin;
    Vec end;
    Vec leftHead;
    Vec rightHead;
};

constexpr double ArrowHeadLen = 10.0;
constexpr double ArrowHeadAngleDeg = 30;
constexpr double ArrowHeadAngle = ArrowHeadAngleDeg * std::numbers::pi / 180;

ArrowData calculateArrowWithLength(const Vec& A, const Vec& B, double R, double angle = ArrowHeadAngle)
{
    ArrowData result;
    result.begin = A;
    auto ba = B - A;
    auto baNorm = ba / std::sqrt(ba * ba);
    result.end = A + baNorm * R;

    auto arrowHead = baNorm * -ArrowHeadLen;

    Vec RotLeftX { std::cos(angle), std::sin(angle) };
    Vec RotLeftY { -RotLeftX.y, RotLeftX.x };

    Vec RotRightX { RotLeftX.x, -RotLeftX.y };
    Vec RotRightY { -RotLeftY.x, RotLeftY.y };

    result.leftHead = result.end + Vec { arrowHead * RotLeftX, arrowHead * RotLeftY };
    result.rightHead = result.end + Vec { arrowHead * RotRightX, arrowHead * RotRightY };

    return result;
}

https://godbolt.org/z/qooMMWjd5

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.