الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اضافة كلاس الى مشروع c++.net 2008

بدأه البريشي في 29 ديسمبر 2013 · 3 رد · 1,601 مشاهدة · في C++.Net
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

لدي كود كلاس جاهز اود استخدامه في مشروع على بيئة 2008 ولكن لم اعرف ان استحدث ملف كلاس جديد لاضافة الكود له حيث ان الكود الذي حصلت عليه لا يوجد فيه classname.h ارجو من الاخوة المساعدة لضيق الوقت

هذا كود الكلاس الذي اود اضافته 

//CLASS DYNAMIC MATRIX
class Mat {
public:
	Mat(int ,int );
	~Mat();
	double get(int ,int ); 
	void set (int ,int , double ); 
private: 
	int num_row;
	int num_col;
	double * val;
};

Mat::Mat(int nrow, int ncol){
	  num_row=nrow;
	  num_col=ncol;
	val =new double [num_row * num_col];
	return;
}
double Mat::get(int row, int col){
	return val[row * this->num_col + col];
}
void Mat::set(int row, int col, double v){
	val[row* this->num_col +col]=v;
	return;

 }
Mat::~Mat(){
	delete [] val;
}

/////////////////////////////Hough1 transform ===============

	double pmin;
	double pmax;
	double tmin;
	double tmax;

Bitmap ^ Hough(Bitmap ^ im1){
	int w=im1->Width,h=im1->Height;
	int thetaMx=180;
	int pMx=181;
Mat * EdgeMag=new Mat(h,w);
Mat * EdgePhase=new Mat(h,w);

//==================sobel
			int filtersize=3;
			int  sobely[3][3]= {-1,-2,-1,
								0 , 0, 0,
								1 , 2, 1};
			int  sobelx[3][3]= {-1, 0, 1,
								-2, 0, 2,
								-1, 0, 1};
			double Rx,Ry;
			int x,y,i,j;
			for (x=0;x<w ;x++)
				for(y=0;y<h ;y++){
					Rx=Ry=0.0;
					for ( i=-filtersize/2;i<=filtersize/2;i++)
						for ( j=-filtersize/2;j<=filtersize/2;j++){
							if (!(x+i<0 || x+i>=w || y+j<0 || y+j>=h)){
								Color c=im1->GetPixel(x+i,y+j);
								int r= (c.R+c.G+c.B)/3;
								Ry+=r*sobely[i+filtersize/2][j+filtersize/2];
								Rx+=r*sobelx[i+filtersize/2][j+filtersize/2];
							}
							else {
								Color cc=im1->GetPixel(x ,y );
								int r= (cc.R+cc.G+cc.B)/3;
								Ry+=r*sobely[i+filtersize/2][j+filtersize/2];
								Rx+=r*sobelx[i+filtersize/2][j+filtersize/2];
							}
						}

					int R=Math::Abs(Rx) + Math::Abs(Ry) ;
					if (R>255)
						R=255;
					EdgeMag->set(y,x,R);
					EdgePhase->set(y,x,Math::Atan2(Ry,Rx));

				}// for 
//=================end sobel

//initilize output image for sin draw
Bitmap  ^outSinCos=gcnew Bitmap(thetaMx,pMx);
for (int x=0;x<thetaMx ;x++)
	for(int y=0;y<pMx ;y++){
		outSinCos->SetPixel(x,y,Color::Black);
	}
//read from magnitude and add to accumilator image outsincos
	 pmin=9999999999.0;
	 pmax=-9999999999.0;
	double p,Pi=Math::PI;
	//scale p
	for (x=0;x<w ;x++)
		for(y=0;y<h ;y++){
			int r=EdgeMag->get(y,x);
			if (r>254){
				for (int i=0;i<thetaMx;i++){
					p=x*Math::Cos(i*Pi/180.0)+y*Math::Sin(i*Pi/180.0);
					if (p<pmin)
						pmin=p;
					if (p>pmax)
						pmax=p;
				}
				
			}
		}
		//accumilate
	for (x=0;x<w ;x++)
		for(y=0;y<h ;y++){
			int r=EdgeMag->get(y,x);
			if (r>254){
				for (int i=0;i<thetaMx;i++){
					p=x*Math::Cos(i*Pi/180.0)+y*Math::Sin(i*Pi/180.0);
					p=180.0*(p-pmin)/(pmax-pmin);
					int r=outSinCos->GetPixel(i,p).R+1;
					if (r>255)
						r=255;
					outSinCos->SetPixel(i,p,Color::FromArgb(r,r,r));

				}
				
			}
		}

return outSinCos;	
}
////////////////////////////////Hough2 transform ===============
	int thetaMx;
	int pMx;

Bitmap ^ Hough2(Bitmap ^ im1){
	int w=im1->Width,h=im1->Height;
	thetaMx=180;
	pMx=181;
Mat * EdgeMag=new Mat(h,w);
Mat * EdgePhase=new Mat(h,w);

//==================sobel
			int filtersize=3;
			int  sobely[3][3]= {-1,-2,-1,
								0 , 0, 0,
								1 , 2, 1};
			int  sobelx[3][3]= {-1, 0, 1,
								-2, 0, 2,
								-1, 0, 1};
			double Rx,Ry;
			int x,y,i,j;
			for (x=0;x<w ;x++)
				for(y=0;y<h ;y++){
					Rx=Ry=0.0;
					for ( i=-filtersize/2;i<=filtersize/2;i++)
						for ( j=-filtersize/2;j<=filtersize/2;j++){
							if (!(x+i<0 || x+i>=w || y+j<0 || y+j>=h)){
								Color c=im1->GetPixel(x+i,y+j);
								int r= (c.R+c.G+c.B)/3;
								Ry+=r*sobely[i+filtersize/2][j+filtersize/2];
								Rx+=r*sobelx[i+filtersize/2][j+filtersize/2];
							}
							else {
								Color cc=im1->GetPixel(x ,y );
								int r= (cc.R+cc.G+cc.B)/3;
								Ry+=r*sobely[i+filtersize/2][j+filtersize/2];
								Rx+=r*sobelx[i+filtersize/2][j+filtersize/2];
							}
						}

					int R=Math::Abs(Rx) + Math::Abs(Ry) ;
					if (R>255)
						R=255;
					EdgeMag->set(y,x,R);
					EdgePhase->set(y,x,Math::Atan2(Ry,Rx));

				}// for 
//=================end sobel

//initilize output image for sin draw
Bitmap  ^outSinCos=gcnew Bitmap(thetaMx,pMx);
for (int x=0;x<thetaMx ;x++)
	for(int y=0;y<pMx ;y++){
		outSinCos->SetPixel(x,y,Color::Black);
	}
//read from magnitude and add to accumilator image outsincos
	 pmin=9999999999.0;
	 pmax=-9999999999.0;
	 tmin=9999999999.0;
	 tmax=-9999999999.0;
	double p,Pi=Math::PI;
	//scale p
	for (x=0;x<w ;x++)
		for(y=0;y<h ;y++){
			int r=EdgeMag->get(y,x);
			if (r>254){
				double t=EdgePhase->get(y,x);
					p=x*Math::Cos(t)+y*Math::Sin(t);
					if (p<pmin)
						pmin=p;
					if (p>pmax)
						pmax=p;
					if (t<tmin)
						tmin=t;
					if (t>tmax)
						tmax=t;
				
			}
		}
		//accumilate
	for (x=0;x<w ;x++)
		for(y=0;y<h ;y++){
			int r=EdgeMag->get(y,x);
			if (r>254){
					double t=EdgePhase->get(y,x);
					p=x*Math::Cos(t)+y*Math::Sin(t);
					
					t=(thetaMx-1)*(t-tmin)/(tmax-tmin);
					p=180.0*(p-pmin)/(pmax-pmin);
					int r=outSinCos->GetPixel(t,p).R+1;
					if (r>255)
						r=255;
					outSinCos->SetPixel(t,p,Color::FromArgb(r,r,r));

				
			}
		}

return outSinCos;	
}



Bitmap ^ line(Bitmap ^ im1){
	Image^ image =im1;
	Graphics ^gr =  Graphics::FromImage(image);
	Pen ^ p1=gcnew Pen(Color::Blue);
	int w=im1->Width;int h=im1->Height;
	gr->DrawLine(p1,0,0,w-1,h-1);
	im1=dynamic_cast<Bitmap^>(image);
	return im1;
}
Bitmap ^ HoughLine(Bitmap ^ im1){
	Image^ image =im1;
	Graphics ^gr =  Graphics::FromImage(image);
	Pen ^ p1=gcnew Pen(Color::Blue);
	int w=im1->Width;int h=im1->Height;
	Bitmap ^ im2=Hough(im1);
	thetaMx=180;
	pMx=181;
double Pi=Math::PI;

	int t,r;
	for (t=0;t<thetaMx ;t++)
		for(r=0;r<pMx ;r++){
			Color c=im2->GetPixel(t,r);
			if (c.R>254){
				double cos_t = Math::Cos(t*Pi/180.0), sin_t = Math::Sin(t*Pi/180.0);
				double rho=pmin+r*(pmax-pmin)/180.0;
				  double x0 = rho*cos_t, y0 = rho*sin_t;
				  double alpha = 1000;
				  Point pt1( Math::Round(x0 + alpha*(-sin_t)), Math::Round(y0 + alpha*cos_t) );
				  Point pt2( Math::Round(x0 - alpha*(-sin_t)), Math::Round(y0 - alpha*cos_t) );
				  gr->DrawLine(p1,pt1,pt2);
			}
		}
	im1=dynamic_cast<Bitmap^>(image);
	return im1;
}
Bitmap ^ HoughLine2(Bitmap ^ im1,int threshold){
	Image^ image =im1;
	Graphics ^gr =  Graphics::FromImage(image);
	Pen ^ p1=gcnew Pen(Color::Blue);
	int w=im1->Width;int h=im1->Height;
	Bitmap ^ im2=Hough2(im1);
	thetaMx=180;
	pMx=181;
double Pi=Math::PI;
	int t,r;
	for (t=0;t<thetaMx ;t++)
		for(r=0;r<pMx ;r++){
			Color c=im2->GetPixel(t,r);
			if (c.R>threshold){
				double rho=pmin+r*(pmax-pmin)/180.0;
				double theta=tmin+t*(tmax-tmin)/180.0;

				double cos_t = Math::Cos(theta), sin_t = Math::Sin(theta);
				  double x0 = rho*cos_t, y0 = rho*sin_t;
				  double alpha = 1000;
				  Point pt1( Math::Round(x0 + alpha*(-sin_t)), Math::Round(y0 + alpha*cos_t) );
				  Point pt2( Math::Round(x0 - alpha*(-sin_t)), Math::Round(y0 - alpha*cos_t) );
				  gr->DrawLine(p1,pt1,pt2);
			}
		}
	im1=dynamic_cast<Bitmap^>(image);
	return im1;
}

معلوماتي بسيطه في C++  اعتقد انه لازم استحدث كلاس باسم Mat.cpp واضافة الكود لكن  كيف استدعيه وهل لازم استخدم header file اله وكيف اعمله

********************* ******************** *********************

(( أشــهد أن لا اله الا الله ..... وأشهد أن محمد رسول الله ))

********************* ******************** *********************

لا تقـل من أيـن أبدأ

طـاعـة الله الـبدايـة

***

لا تقـل أين طـريـقي

شــرع الله الهـدايـة

***

لا تـقـل أيـن نعـيمي

جـنـة الله كـفـايـــــة

***

لا تقـل في الغـد أبدأ

ربمـــا تأتـي النهـايـــة

**************** **************** ****************

#2

قم بحفظ الكود داخل ملف بأى إسم و بالإمتداد h أو hpp مثلا "header.hpp".

 

قم بإضافة السطر التالي قبل أى كود بذلك الملف:

using namespace System::Drawing;

من داخل أى ملف cpp قم بعمل include للملف "header.hpp" كالتالي:

#include "header.hpp"

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#3

مشكور اخي الكريم C++err على الرد

 

للاسف صار يعطيني اخطاء على كل استدعائات Math في الكود

 

حاولت استدعاء الكلاس كالاتي

#include <math.hpp>

والمشكلة لم تحل

حاولت استدعاء الكلاس بالرغم من الاخطاء وايضا لم يظهر اسماء functions حتى استدعيها واقصد كمثال Hough و Hough2 ...

بحثت عن اخطاء في الاقواس ولم اجد شيء

 

اود التركيز على ان المطلوب مني فقط تستدعاء ونفيذ Hough في الكلاس السابق 

حاليا سأحاول تنفيذه من نفس الفورم form  على اعتبار انه function راجيا المساعده في استدعائه كـ class

تم تعديل هذه المشاركة بواسطة البريشي في 29 ديسمبر 2013 في 21:32

********************* ******************** *********************

(( أشــهد أن لا اله الا الله ..... وأشهد أن محمد رسول الله ))

********************* ******************** *********************

لا تقـل من أيـن أبدأ

طـاعـة الله الـبدايـة

***

لا تقـل أين طـريـقي

شــرع الله الهـدايـة

***

لا تـقـل أيـن نعـيمي

جـنـة الله كـفـايـــــة

***

لا تقـل في الغـد أبدأ

ربمـــا تأتـي النهـايـــة

**************** **************** ****************

#4

الإسم Hough هو لدالة و ليس لكلاس و لإستدعائه من داخل فئة تحتاج لوضع الكود داخل فئة!!.

 

اقتباس
للاسف صار يعطيني اخطاء على كل استدعائات Math في الكود

قم بإضافة السطر التالي فى أول الكود:

using namespace System;

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

مواضيع مشابهة