I believe that having the same member names is a bad idea in this case, because it makes the code more error prone.
Imagine the scenario: you have a couple of cartesian points: pntA and pntB. Then you decide, for some reason, that they should better be represented in polar coordinates, and change the declaration and constructor.
Now, if all your operations were just method calls like:
double distance = pntA.distanceFrom(pntB);
then you're fine. But what if you used the members explicitly? Compare
double leftMargin = abs(pntA.x - pntB.x);
double leftMargin = abs(pntA.first - pntB.first);
In the first case, the code will not compile. You'll see the error immediately and will be able to fix it. But if you have the same member names, the error will be only on the logical level, much harder to detect.
If you write in a non-object-oriented language, then it's even easier to pass wrong struct to the function. What's to stop you from writing the following code?
double distance = calculate_distance_polar(cartesianPointA, polarPointB);
Different data types, on the other hand, would allow you to find the error during compilation.