PDA

View Full Version : فرمول جمع و ضرب بردار نقطه ای



kivoon
پنج شنبه 03 شهریور 1390, 17:50 عصر
سلام و خسته نباشید به دوستان برنامه نویس.
من فقط فرمول حساب جمع و ضرب بردار رو می خواستم که چه جوری حساب میشه .
اگه ممکنه کمکم کنین.
اگه این فرمول رو بدونم می تونم برنامشو بنویسم
بردارش دو بعدی باشه
اگه امکان داره مثل فرمول ریاضی به زبان برنامه نویسی باشه
مثلا این جوری
(a*b)/cos(h);

djsohrab2007
پنج شنبه 03 شهریور 1390, 18:11 عصر
سلام،
به این صورت که اگر بردار A به صورت (a,b) و بردار B به صورت (c,d) باشد برای جمع و ضرب درونی داریم :

A+B = ( a+c,b+d)
A.B=a.c+b.c

همانطور که دیدید حاصل ضرب عددی ( درونی ) دوبردار برابر یک عدد می باشد البته فرمول دیگر هم هست :

A.B = |A|.|B|.Cos(<A,B>)

که <A,B> در ریاضیات به معنی زاویه بین دو بردار Aو B است و |A| به معنی اندازه ی بردار A که برابر sqrt ( a^2 + b^2 ) است. برای ضرب خارجی دوبردار cos تبدیل به sin می شود. و برخلاف ضرب درونی، ضرب خارجی کمیتی برداری است.

kivoon
پنج شنبه 03 شهریور 1390, 20:20 عصر
مرسی دوست عزیز
من چیزی نفهمیدم میشه بگی فرمول عکس زیر چه جوری در میاد
74373

djsohrab2007
پنج شنبه 03 شهریور 1390, 23:04 عصر
مرسی دوست عزیز
من چیزی نفهمیدم میشه بگی فرمول عکس زیر چه جوری در میاد
74373

سلام ، خواهش می کنم رفیق این حرفا چیه .
اینکه متوجه نشدی به این خاطر است که امکان ریاضی نوشتن در اینجا زیاد فراهم نیست ، من چون معلم ریاضی هستم فقط جواب سوال شما را نخواهم داد من الان چند صفحه کوناه در مورد بردار توی یک فایل ورد می نویسم و در آخر سوال شما را می نویسم و به آن جواب می دهم، آن را به صورت یک pdf ( البته rar می کنمش ) اینجا می گذارم تا دانلود کنی، بخونش اگر سوال داشتی بپرس
البته ، شاید فهمیدن چیزهایی که نوشتم روی بردار دو بعدی یک خورده سخت باشه چون بگی نگی خاصه ولی بعد از اینکه جواب سوال شما را نوشتم در حد چند خط در مورد همین چیزا تو بردار سه بعدی گفتم، بخونش که باعث می شه خیلی قشنگ بفهمی،
فقط تو خوندان ای مقاله عجله نکن اگر دیدی اولش یک کمی گیج کننده است صبر داشته باش و تا آخر بخون ، کلش شده 2 صفحه.

موفق باشید

kivoon
پنج شنبه 03 شهریور 1390, 23:44 عصر
از این چیزی که فهمیدم ببین این کد درسته
ممنون بابت مقالت . الان می خونمش
#include <iostream.h>
#include <math.h>
#include <conio.h>
long double num;
class vector{
float x1,x2,y1,y2,d;
public:
vector(float x,float y,float xx,float yy){x1=x;y1=y;x2=xx;y2=yy;}
vector(float x,float y,float xx,float yy,float d1){x1=x;y1=y;x2=xx;y2=yy;d=d1;}
long double operator +(vector ob);
long double operator -(vector ob);
long double operator *(vector ob);
};
long double vector :: operator + (vector ob) {
num=(x1+ob.x1)+(x2+ob.x2)+(y1+ob.y2)+(y2+ob.y2);
return num;
}
long double vector :: operator - (vector ob) {
num=(x1-ob.x1)+(x2-ob.x2)+(y1-ob.y2)+(y2-ob.y2);
return num;
}
long double vector :: operator * (vector ob) {
long double v1,v2;
v1=sqrt(pow((x2-x1),2)+pow((y2-y1),2));
v2=sqrt(pow((ob.x2-ob.x1),2)+pow((ob.y2-ob.y1),2));
num=(v1*v2)*cos(d);
return num;
}
int main()
{
vector o1(1,1,2,3,40),o2(1,2,3,4);
cout<<o1*o2;
getch();
}

djsohrab2007
جمعه 04 شهریور 1390, 00:09 صبح
نه این کد اصلا خوب نیست، صبر کن الان یک دونه برات می نویسم فقط زیاد نمی تونم روش وقت بزارم چون دارم رو استفاده از dll کار می کنم ( هر کاری می کنم درست نمیشه )

ولی کدی که برات می نویسم نسبتا بهتره، اگر جاییش مشکل داشتی بگو

kivoon
جمعه 04 شهریور 1390, 00:23 صبح
ok ممنون . منم دارم روش کار میکنم . جمعش هموم عدد کی توی pdf در اوردی در اومد. ضربش دارم کار می کنم

kivoon
جمعه 04 شهریور 1390, 00:42 صبح
دوست عزیز من یه کد دیگه نوشتم ببین خوبه برای جمع و ضرب
#include <iostream.h>
#include <math.h>
#include <conio.h>
long double num;
class vector{
float x1,x2,y1,y2,d;
public:
vector(float x,float y){x1=x;y1=y;}
vector(float x,float y,float xx,float yy){x1=x;y1=y;x2=xx;y2=yy;}
vector(float x,float y,float xx,float yy,float d1){x1=x;y1=y;x2=xx;y2=yy;d=d1;}
float gx(){return x1;}
float gy(){return y1;}
vector operator +(vector ob);
long double operator -(vector ob);
vector operator *(vector ob);
};
vector vector :: operator + (vector ob) {
x1=((x1-x2)+(ob.x1-ob.x2))*-1;
y1=((y1-y2)+(ob.y1-ob.y2))*-1;
return *this;
}
long double vector :: operator - (vector ob) {
num=(x1-ob.x1)+(x2-ob.x2)+(y1-ob.y2)+(y2-ob.y2);
return num;
}
vector vector :: operator *(vector ob) {
x1=(x1-x2);
y2=(y1-y2);
ob.x1=(ob.x1-ob.x2);
ob.y2=(ob.y1-ob.y2);
x1=(x1*ob.x1)+(y2*ob.y2);
return *this;
}
int main()
{
vector o1(1,1,1,5,40),o2(1,1,3,3),o3(0,0);
o3=o1*o2;
cout<<o3.gx()<<'\n';
vector o5(1,1,1,5,40),o6(1,1,3,3);
o3=o5+o6;
cout<<o3.gx()<<" "<<o3.gy();
getch();
}

kivoon
جمعه 04 شهریور 1390, 00:44 صبح
برای این فرمول چه کدی بنویسم به نظرم این بهتر باشه
A.B = |A|.|B|.Cos(<A,B>)

djsohrab2007
جمعه 04 شهریور 1390, 01:00 صبح
خوب اینم فایل .h



//vector.h
#ifndef VECTOR
#define VECTOR

#include<iostream>
using namespace std;

class vector
{

private:
float x;
float y;

public:

vector operator+ ( vector B );
vector operator- ( vector B );
float operator* ( vector B ); //zarb dakheli

friend ostream &operator << ( ostream& , const vector& );

vector(float X , float Y);
vector( float x1 , float y1 , float x2 , float y2 ) ;
~vector(void);
};


#endif

djsohrab2007
جمعه 04 شهریور 1390, 01:19 صبح
ببخشید دیر شد حدود 30 دقیقه است که اینترنتم قطع شده بود الان دیدم IDM شروع کرد به دانلود فهمیدم دوباره وصل شدم .
خوب اینم فایل .cpp
//vector.cpp
#include "vector.h"
#include <conio.h>

vector::vector(float X , float Y)
{
x = X ;
y = Y ;
}

vector::vector( float x1 , float y1 , float x2 , float y2 )
{
x = x2 - x1 ;
y = y2 - y1 ;
}

vector vector::operator+( vector B )
{
vector temp(x+B.x , y+B.y );
return temp ;
}

vector vector::operator-( vector B )
{
vector temp(x-B.x , y-B.y );
return temp ;
}

float vector::operator*( vector B )
{
return ( x*B.x + y*B.y) ;
}

ostream &operator << ( ostream &output, const vector& v )
{
output<<"("<<v.x<<" , " <<v.y <<" ) " ;
return output;
}

vector::~vector(void)
{
}


int main(void)
{
vector v1 (1,1,1,5);
vector v2 (1,1,3,3);

cout<<"v1 = " << v1 << endl ;
cout<<"v2 = " << v2 << endl ;
cout<<"v1 + v2 = " <<( v1+v2 ) << endl ;
cout<<"v1 - v2 = " <<( v1-v2 ) << endl ;
cout<<"v1 . v2 = " <<v1*v2 << endl ;
getch();
return 0;
}

djsohrab2007
جمعه 04 شهریور 1390, 01:23 صبح
ببین این کلاس بردار را میشه خیلی کامل تر هم نوشت مصلا همون فرمول که گفتی را بهش اضافه کن ( البته فرقی نمی کنه )، میشه تابعی اضافه کرد که اندازه بردار را بر گردونه ، میشه تابعی نوشت که ضرب خارجی را بر گردونه، میشه تابعی نوشت که دو بردار ورودی بگیرد بعد زاویه بین دو بردار را بر گرداند. و ...

موفق باشید

djsohrab2007
جمعه 04 شهریور 1390, 01:26 صبح
74383

اینم یک تصویر از خروجی برنامه بالا

kivoon
جمعه 04 شهریور 1390, 01:44 صبح
دوست عزیز ممنون ازت . واقعا کارت درسته . امید وارم تو همه کارات موفق باشی
ممنون که وقط گذاشتی

djsohrab2007
جمعه 04 شهریور 1390, 02:19 صبح
نبابا این حرفا چیه ، ممنون
موفق باشی

kivoon
جمعه 04 شهریور 1390, 02:28 صبح
#include <conio.h>
#include <iostream.h>
#include <math.h>
class vector{
float x;
float y;
float d;
public:
vector(float D);
vector(float X , float Y);
vector( float x1 , float y1 , float x2 , float y2 ) ;
~vector();
vector operator+ ( vector B );
vector operator- ( vector B );
float operator* ( vector B ); //zarb dakheli
float operator/ ( vector B ); //zarb dakheli
friend ostream & operator <<( ostream & output, const vector& v);
};
vector::vector(float D) {
d = D ;
}
vector::vector(float X , float Y) {
x = X ;
y = Y ;
}
vector::vector( float x1 , float y1 , float x2 , float y2 ) {
x = x2 - x1 ;
y = y2 - y1 ;
}
vector vector::operator+( vector B ) {
vector temp(x+B.x , y+B.y );
return temp ;
}
vector vector::operator-( vector B ) {
vector temp(x-B.x , y-B.y );
return temp ;
}
float vector::operator*( vector B ) { // fu:1 for vector *
return ( x*B.x + y*B.y) ;
}
float vector::operator/( vector B ) { // fu:2 for vector *
long n1,n2,n3;
n1=sqrt(pow(x,2)+pow(y,2));
n2=sqrt(pow(B.x,2)+pow(B.y,2));
n3=(n1*n2)*cos(d);
return (n3) ;
}
ostream & operator <<(ostream & output, const vector& v){
output<<"("<<v.x<<" , " <<v.y <<" ) " ;
return output;
}
vector::~vector(){}
int main() {
vector v1 (1,1,1,5);
vector v2 (1,1,3,3);
vector d (30);
cout<<"v1 = " << v1 << endl ;
cout<<"v2 = " << v2 << endl << endl;
cout<<"v1 + v2 = " <<( v1+v2 ) << endl ;
cout<<"v1 - v2 = " <<( v1-v2 ) << endl ;
cout<<"1 v1.v2 = " <<v1*v2 << endl ;
cout<<"2 v1.v2 = " <<v1/v2 << endl ;
getch();
return 0;
}
74387

djsohrab2007
جمعه 04 شهریور 1390, 03:00 صبح
چرا اساس کلاس را بردی زیر سوال !!!!!!1
زاویه برای یک بردار تعریف نمیشه که !!!!

ببن زاویه خصلت نیست که توی اعضای کلاس گذاشتی، تو برای استفاده از فرمول دوم باید دو تا برداری که گرفتی را زاویه بینش را با یک تابع بدست بیاری بعد از اون فرمول استفاده کنی
برو فصل اول درس هندسه تحلیلی سال پیش دانشگاهی را بخوان مگرنه فقط وقتت را تلف می کنی

kivoon
جمعه 04 شهریور 1390, 12:42 عصر
ببخشید .
من نمیدونستم زاویه هم حساب می شه .
ممنون از راهنمایت . درست می کنم دوباره می زارم

kivoon
جمعه 04 شهریور 1390, 13:06 عصر
دوست عزیز فرمول ضرب با روش این روش درسته

float vector::operator/( vector B ) { // fu:2 for vector *
float n1,n2,n3,d;
d=((x*B.x)+(y*B.y));//for zavea
n1=sqrt(pow(x,2)+pow(y,2));
n2=sqrt(pow(B.x,2)+pow(B.y,2));
n3=(n1*n2)*cos(d/(n2*n1));
return (n3) ;
}

djsohrab2007
شنبه 05 شهریور 1390, 00:51 صبح
ببین من دیروز خوابم می امد ، فکر کنم خوب توضیح ندادم باعث شد یک خورده ذهنت بهم بریزه :

موضوع اول : نوشتن تابع برای حساب ضرب داخلی
ما 2 تا فرمول برای حساب کردن ضرب داخلی 2 تا بردار داریم : ( دقت : اعضای خصوصی کلاس بردار برای 1 بردار است )
1. فرمول اول A.B = a.c + b.d
2.فرمول کسینوسی : A.B = |A|.|B|.Cos(<A,B>)

خوب فرمول اول وقتی بدرد می خوره که :
* ما موله های 2 بردار را داشته باشیم یعنی به این صورت که A= ( a,b ) و B=(c,d)
پس تابع ضرب ما در اینجا دو شی از کلاس vector را ورودی می گیرد
( چون من از operator overloading استفاده کردم 1 ورودی داشت )

فرمول دوم هم وقتی بدرد می خوره که ما فقط :
1. زاویه ی بین دو بردار و 2. اندازه های دو بردار را داشته باشیم.
پس تابع ضرب ما 3 تا عدد اعشاری ورودی می گیرد و یک عدد اعشاری return می کند
( دیگر لازم نیست از operator overloading استفاده کنی چون این تابع روی شی از این کلاس نیست )

djsohrab2007
شنبه 05 شهریور 1390, 00:56 صبح
موضوع دوم : نوشتن تابعی که زاوی بین دو بردار را حساب کند

در این تابع دو شی از کلاس را ورودی می گیری و زاویه ( عدد ) بر میگردانی
فرمولشم که واضحه از روی فرمول ضرب داخلی کسینوس را حساب می کنی و با فرض اینکه زاویه بین 0 تا 180 باشه از روی کسینوس زاویه را حساب می کنی ( ArcCos )

kivoon
شنبه 05 شهریور 1390, 15:22 عصر
سلام . خسته نباشی
من برای فرمول دومی این کد رو نوشتم ببین خوبه
74464

djsohrab2007
شنبه 05 شهریور 1390, 15:52 عصر
ببین عزیز قبل از اینکه بری سراغ برنامه نویسی ، برو پایه اساسش ریاضیش را یاد بگیر ، اگر دقت می کردی عرض کردم که زاویه بین دو بردار را میشه فرض کنی بین 0 تا 180 ، اول برای این بنویس بعد با توجه به مقدار sin که از ضرب خارجی بدست میاری می تونی ببینی که زاویه مثبته یا منفی ( دقت -90 = 270 )
راستش من کد شما را بررسی نکردم شاید برای بردار دو بعدی جواب بده ولی کدی ارزش داره که بشه تعمیمش داد نه اینکه در حالت خاص کار کنه

djsohrab2007
شنبه 05 شهریور 1390, 19:26 عصر
من کدم را کامل تر کردم و این بار برای بردار 3 بعدی نوشتم و توابعی که تا الان تو داشتی روی آن کار می کردی را هم اضافه کردم ، با خوندن دقیق این کد فکر کنم کامل متوجه بشی.
فقط چند دقیقه وایسا تستش کنم ببینم درسته یا نه بعد می زارم رو سایت

djsohrab2007
یک شنبه 06 شهریور 1390, 00:40 صبح
نمی دونم چرا هرچی پست را می فرستم ، این صفحه را دوباره باز می کنم می بینم نیست، این آخرین دفعه است که می فرستم فکر کنم باگ پیدا کرده اگر پستم امد بی زحمت یک پیام خصوصی بده ( نمی دونم شاید تا الان 50 نسخه از این پست اومده باشه ، البته به جز این دو خطی که الان نوشتم !!! )

فایل .h :
//vector.h
#ifndef VECTOR
#define VECTOR

#include<iostream>
using namespace std;

namespace Vectors
{
class vector
{

private:
double x;
double y;
double z;
public:

double Inerproduct ( double sizeA, double sizeB , double degree );
double Inerproduct ( vector& B ) ;
vector Outproduct ( vector& B ) ;
double SizeOutproduct ( vector& B );
double Size () ;

vector(double X , double Y , double Z);
vector( double x1 , double y1 , double z1 , double x2 , double y2 , double z2 ) ;
~vector(void);

//Operator Overloading
vector operator+ ( vector B );
vector operator- ( vector B );
double operator* ( vector B ); //zarb dakheli
friend ostream &operator << ( ostream& , const vector& );
};

double doDegree( vector A , vector B ) ; // return <A,B>
}

#endif

djsohrab2007
یک شنبه 06 شهریور 1390, 00:48 صبح
خوب خدا را شکر ، مثل اینکه درست شد. الان فایل .cpp را هم می فرستم

djsohrab2007
یک شنبه 06 شهریور 1390, 00:49 صبح
اینم از فایل .cpp :

//vector.cpp
#define _USE_MATH_DEFINES
#include <math.h>
#include "vector.h"
#include <conio.h>


using namespace Vectors;

vector::vector(double X , double Y , double Z)
{
x = X ;
y = Y ;
z = Z ;
}

vector::vector( double x1 , double y1 , double z1 , double x2 , double y2 , double z2 )
{
x = x2 - x1 ;
y = y2 - y1 ;
z = z2 - z1 ;
}



double vector::Inerproduct(double sizeA , double sizeB , double degree )
{
return sizeA*sizeB*cos(degree);
}
double vector::Inerproduct(vector& B ) // = operator*
{
return ( x*B.x + y*B.y + z*B.z) ;
}

double vector::Size()
{
return ( sqrt(pow(x,2)+pow(y,2) +pow(z,2)) );
}

vector::~vector(void)
{
}

vector vector::Outproduct ( vector& B )
{
vector temp(y*B.z - B.y*z , B.x*z-x*B.z , x*B.y-B.x*y);
return temp ;
}
double vector::SizeOutproduct(vector& B )
{
return ( Outproduct( B ).Size() ) ;
}

//operator Overloading
double vector::operator*( vector B )
{
return ( x*B.x + y*B.y + z*B.z) ;
}

ostream& Vectors::operator<< ( ostream &output, const vector& v )
{
output<<"("<<v.x<<" , " <<v.y <<" , " <<v.z<< " ) " ;
return output;
}
vector vector::operator+( vector B )
{
vector temp(x + B.x , y + B.y , z + B.z);
return temp ;
}

vector vector::operator-( vector B )
{
vector temp(x - B.x , y - B.y , z - B.z);
return temp ;
}

//Other Function
double Vectors::doDegree( vector A , vector B )
{
double COS = A.Inerproduct(B) / ( A.Size() * B.Size() ) ;
double SIN = A.SizeOutproduct(B) / ( A.Size() * B.Size() ) ;

if ( COS == 0.0000000000 )
{
if ( SIN == 1 )
return 90 ;
if ( SIN == -1 )
return 270 ;
}

double TAN = SIN/COS ;
if ( COS > 0 )
return (180 * atan( TAN ) / M_PI );
else
return ( 180 + 180 * atan( TAN ) / M_PI ) ;
}
int main(void)
{
vector v1 (1,1,1,1,5,3);
vector v2 (1,1,1,3,3,8);

cout<<"v1 = " << v1 << endl ;
cout<<"v2 = " << v2 << endl ;
cout<<"v1 + v2 = " <<( v1+v2 ) << endl ;
cout<<"v1 - v2 = " <<( v1-v2 ) << endl ;
cout<<"v1 . v2 = " <<v1*v2 << endl ;
cout<<"|v1| = " <<v1.Size() << endl ;
cout<<"|v2| = " <<v2.Size() << endl ;

cout<<"<v1,v2> = " <<Vectors::doDegree(v1 ,v2 ) << endl ;
getch();
return 0;
}

در مورد پیام خصوصیت : خوب حالا راه حل خودت را با این چک کن ببین درسته یا نه!