AcGePoint3d sorting

AcGePoint3d sorting

Anonymous
Not applicable
1,232 Views
3 Replies
Message 1 of 4

AcGePoint3d sorting

Anonymous
Not applicable

Probably more of a C++ question than ARX, and I'm sorry ahead of time, but can anyone tell me what is going wrong here? The code below will compile and run when I pass in an AcGePoint3dArray of several points, but the array is unchanged after it runs...

int pointSortByX(const void *p1, const void *p2){
	return ((AcGePoint3d*)p1)->x - ((AcGePoint3d*)p2)->x;}

int pointSortByY(const void *p1, const void *p2){
	return ((AcGePoint3d*)p1)->y - ((AcGePoint3d*)p2)->y;}

void sortPoints(AcGePoint3dArray allIntersPts)
{
	/*the first two elements are the start and endpoints. Use them to determine
	if the array should be sorted by x or y values. */
	
	double distInX = abs(allIntersPts.at(0).x - allIntersPts.at(1).x);
	double distInY = abs(allIntersPts.at(0).y - allIntersPts.at(1).y);
	
	//if the line is more vertical, then sort by the y-coords
	if(distInY > distInX)
		std::qsort(allIntersPts.asArrayPtr(), allIntersPts.length(), sizeof(AcGePoint3d), pointSortByY);
	//else the line is more horizontal, then sort by the x-coords
	else
		std::qsort(allIntersPts.asArrayPtr(), allIntersPts.length(), sizeof(AcGePoint3d), pointSortByX);
	return;
}


AcGePoint3dArray allIntersPts;
/*code to append some points*/
acutPrintf(_T("\nBefore sort:"));
		for(int i = 0; i < allIntersPts.logicalLength(); i++)
			acutPrintf(_T("\n%d: %.3f, %.3f"), i, allIntersPts.at(i).x, allIntersPts.at(i).y);

sortPoints(allIntersPts);

acutPrintf(_T("\nAfter sort:"));
		for(int i = 0; i < allIntersPts.logicalLength(); i++)
			acutPrintf(_T("\n%d: %.3f, %.3f"), i, allIntersPts.at(i).x, allIntersPts.at(i).y);

 TIA,

Ralph Gaston

0 Likes
1,233 Views
3 Replies
Replies (3)
Message 2 of 4

artc2
Autodesk
Autodesk

You need to pass the array by reference so that you are operating on the original array not a copy.

0 Likes
Message 3 of 4

owenwengerd
Advisor
Advisor

It looks like you intended to pass  the argument to sortPoints() by reference instead of by value.

--
Owen Wengerd
ManuSoft
0 Likes
Message 4 of 4

Anonymous
Not applicable

That appears to have fixed it. Thanks to both of you. I thought I was passing in the address just because it was an array. Pretty embarrassing, but no telling how much time it saved me. Thanks again!

0 Likes