Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Kaburagi

[C++] Iloczyn wektorowy

Rekomendowane odpowiedzi

Witam.

Mam problem ze zwracaniem wartości z funkcji:

 

VECTOR3 IloczynWektorowy(VECTOR3 vWektor1, VECTOR3 vWektor2)
{
VECTOR3 vWynik;

vWynik.x = vWektor1.y * vWektor2.z - vWektor2.y * vWektor1.z;
vWynik.y = vWektor2.x * vWektor1.z - vWektor1.x * vWektor1.z;
vWynik.z = vWektor1.x * vWektor2.y - vWektor2.x * vWektor1.y;

return vWynik;
}

 

Przy czym tak jest wywoływana:

 

cout << "Iloczyn wektorowy dla podanych wartosci = " << IloczynWektorowy(Wektor1, Wektor2).x << " " << IloczynWektorowy(Wektor1, Wektor2).y << " " << IloczynWektorowy(Wektor1, Wektor2).z;

 

 

Program kompiluje się, odpala, wszystko liczy.. Ale taki zapis pozostawia u mnie pewien niesmak. Po co robić coś 3 razy, skoro można raz.. :) Można to zrobić za jednym razem? Ewentualnie jak.

 

 

Poniżej cały kod programu.

 

 

#include <cmath>
#include <conio.h>
#include <iostream>

using namespace std;

struct VECTOR3
{
// współrzędne wektora
float x, y, z;

// konstruktory
VECTOR3()			        { x = y = z = 0.0; }		
VECTOR3(float fX, float fY, float fZ)	{ x = fX; y = fY; z = fZ; }

// -------------------------------------------------------

// metody

float Dlugosc() const { return sqrt(x * x + y * y + z * z); }
void Normalizuj()
{
	float fDlugosc = Dlugosc();

	// dzielimy każdą współrzędną przez długość
	x /= fDlugosc; y /= fDlugosc; z /= fDlugosc;
}
};

float IloczynSkalarny(VECTOR3 vWektor1, VECTOR3 vWektor2)
{
float fWynik = (vWektor1.x * vWektor2.x) + (vWektor1.y * vWektor2.y) + (vWektor1.z * vWektor2.z);

return fWynik;
}

VECTOR3 IloczynWektorowy(VECTOR3 vWektor1, VECTOR3 vWektor2)
{
VECTOR3 vWynik;

vWynik.x = vWektor1.y * vWektor2.z - vWektor2.y * vWektor1.z;
vWynik.y = vWektor2.x * vWektor1.z - vWektor1.x * vWektor1.z;
vWynik.z = vWektor1.x * vWektor2.y - vWektor2.x * vWektor1.y;

return vWynik;
}

void main()
{
VECTOR3 Wektor1(1.0, 2.0, 3.0);
VECTOR3 Wektor2(4.0, 5.0, 6.0);
//Wektor1.Normalizuj();
//Wektor2.Normalizuj();

cout << "Iloczyn skalarny dla podanych wartosci  = " << IloczynSkalarny(Wektor1, Wektor2) << endl;
cout << "Iloczyn wektorowy dla podanych wartosci = " << IloczynWektorowy(Wektor1, Wektor2).x << " " << IloczynWektorowy(Wektor1, Wektor2).y << " " << IloczynWektorowy(Wektor1, Wektor2).z;

getch();
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie da się po prostu przypisać wyniku do jakiejś struktury? Nie da się stworzyć jakiegoś wskaźnika do wyniku? :E

Od bardzo dawna nie programowałem w C++ (i nigdy tego języka porządnie nie opanowałem), ale pytanie wydaje się dziwne.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wygrzebałem u siebie jakieś IDE do C++ (tak, DevC+...).

 

int main()
{
       VECTOR3 Wektor1(1.0, 2.0, 3.0);
       VECTOR3 Wektor2(4.0, 5.0, 6.0);
       //Wektor1.Normalizuj();
       //Wektor2.Normalizuj();
       //VECTOR3 ilw = IloczynWektorowy(Wektor1, Wektor2);
       VECTOR3 *ilw = &IloczynWektorowy(Wektor1, Wektor2);
       VECTOR3 ilwn = IloczynWektorowy(Wektor1, Wektor2);
       cout << "Iloczyn skalarny dla podanych wartosci  = " << IloczynSkalarny(Wektor1, Wektor2) << endl;
       cout << "Iloczyn wektorowy dla podanych wartosci = " << ilw->x<< " " << ilw->y << " " << ilw->z;
       cout << "Iloczyn wektorowy dla podanych wartosci = " << ilwn.x<< " " << ilwn.y << " " << ilwn.z;

       getch();
}

Na dwa sposoby. Teraz wiesz o co mi chodziło?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Raczej oczywistym się wydaje, że jak masz

X.{x,y,z}, to musisz napisać X.x, X.y, X.z. No mógłbyś to jakoś uproscić gdybyć np napisał metodę toString i raz byś miał, albo jakąś łądną abstrakcje. Tylko powoli, tu wchodzisz w programowanie obiektowe.

EDIT napisane bardzo ideowo.

struct Vector2{
float x,y;
string to String(){
 std::ostringstream stringStream;

 stringStream<<"x = "<<x<<" y= "<<y
 std::string copyOfStr = stringStream.str();
 return copyOfStr;
}
}
struct Vector3:Vector2{
float z;
strint toString(){
 std::ostringstream stringStream;

 stringStream<<Vector2::toString() << " z = "<<z;
 std::string copyOfStr = stringStream.str();
 return copyOfStr;
}
}

 

 

EDIT Druga rzecz, którą widać w kodzie wyżej, ale mi się nie chciało pisać i w twoim też. Zwracasz struktury przez wartość, co prawda kompilator, to optymalizuje ale nie jest to zbyt bezpieczne. Możesz, to rozwiązać na kilka sposobów, albo zwracać wskaźnik do zaalackowanego Vectora(lub string jak wyzej), albo podać refencje, wskaźnik w funkcji do wyniku. To będzie działać co piszesz nawet dla małych struktór powinno się tak robić ze względu na szybkość tego rozwiązania, ale stos jest mały i kiedyś możesz przez to cierpieć.

 

Lepiej, żebyś tego nie robił, bo kiedyś napiszesz coś takiego. To jest złe, bo tworzy się referencję do zmiennej, która zaraz zginie i ma niezdefiniowane zachowanie.

string & name(){
string nam= "foo";
return nam;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Raczej oczywistym się wydaje, że jak masz

X.{x,y,z}, to musisz napisać X.x, X.y, X.z. No mógłbyś to jakoś uproscić gdybyć np napisał metodę toString i raz byś miał, albo jakąś łądną abstrakcje. Tylko powoli, tu wchodzisz w programowanie obiektowe.

 

Tak, oczywistym jest, że muszę "dostać się" do x,y,z. Rzecz w tym czy nie da się tego jakoś "oprawić", uprościć.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

przecież wyżej masz rozwiązanie - przypisujesz do zmiennej i z niej wyciągasz x,y i z

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Już nie pamiętam jak się to robiło i nie do końca jestem pewny czy o to autorowi chodzi, ale.. przecież można zaprzyjaźnić operator >> z klasą VECTOR3 (działa to jak toString() w Javie o którym już ktoś powyżej napisał). Wtedy wyświetlenie VECTOR3 odbywa się zgodnie z oczekiwaniami<?> czyli:

VECTOR3 test;
//...
cout << test;

 

Na szybko znalezione --> http://pl.wikibooks.org/wiki/C++/Przeci%C4%85%C5%BCanie_operator%C3%B3w#Przyk.C5.82ad_zastosowania

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak, oczywistym jest, że muszę "dostać się" do x,y,z. Rzecz w tym czy nie da się tego jakoś "oprawić", uprościć.

#include<iostream>
using namespace std;
struct v3{
   int &x;
   int &y;
   int &z;

};
void do_sth(v3 & r){
   r.x=1;
   r.y=2;
   r.z=3;
}
int main(){
   int x[3];
   v3 y={x[0],x[1],x[2]};
   do_sth(y);
   cout<<x[0]<<x[1]<<x[2]<<endl;
   return 0;
}

O takie coś ci chodzi? Nie musisz wtedy robić. y.x,y.y,y.z. Możesz napisać pętle for. Nie jest jednak to eleganckie moim zdaniem.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@Qwerty5712 - myślałem o takim czymś, ale moim zdaniem też nie jest to "eleganckie" rozwiązanie.

 

Pobawię się jeszcze przeciążeniami. :)

 

Dzięki za podpowiedzi.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...