|
As mentioned above, you've got an error in the way you're defining the properties.
Another point, the sin and cos functions work in radians not degrees, so I don't think you'll end up with the triangle you're expecting. You need to divide degrees by 180 and multiply by Math.PI to do the conversion.
Regards,
Rob Philpott.
|
|
|
|
|
Rob Philpott wrote: the sin and cos functions work in radians not degrees
They do? I've been using calculators for so many years I never even looked! That makes perfect sense, though, as radian measure is so much more useful for engineering calculations, and I have some future projects in mind that will need it. Thanks for the tip!
"A Journey of a Thousand Rest Stops Begins with a Single Movement"
|
|
|
|
|
Hi again Roger,
Basically, it's easiest to have a private backing field.
private int myValue; In the constructor, take this as a parameter and assign to the field
public MyClassOrStruct(int myValue)
{
this.myValue = myValue;
} Then have a readonly property that returns the field
public int MyValue
{
get { return myValue; }
} In the case of a value that is calculated from other given values (such as Vertex1...), just provide the property and do the calculation in the getter
public int Square
{
get { return myValue * myValue; }
}
Your triangle would now look something like this - I've used your calculations shown so you may need to ammend to include Rob's correction above.
using System;
using System.Drawing;
namespace ShapesLibrary
{
public struct Triangle
{
public static readonly Triangle Empty = new Triangle();
private Point anchor;
private float angle;
private int radius;
public Triangle(Point anchor, Int32 radius, float angle)
{
this.anchor = anchor;
this.angle = angle;
this.radius = radius;
}
public Point Anchor
{
get { return anchor; }
}
public float Angle
{
get { return angle; }
}
public float Radius
{
get { return radius; }
}
public Point Vertex1
{
get
{
return new Point(
(int)(radius * Math.Cos(angle)),
(int)(radius * Math.Sin(angle)));
}
}
public Point Vertex2
{
get
{
return new Point(
(int)(radius * Math.Cos(angle + 120)),
(int)(radius * Math.Sin(angle + 120)));
}
}
public Point Vertex3
{
get
{
return new Point(
(int)(radius * Math.Cos(angle + 240)),
(int)(radius * Math.Sin(angle + 240)));
}
}
}
}
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
DaveyM69 wrote: // Immutable struct
public struct Triangle
What would be the advantage of using a struct here?
There are only 10 types of people in this world — those who understand binary, and those who don't. |
|
|
|
|
|
As a Triangle can never change (if it did - it should be a new triangle!) it makes more sense.
There is a plethora of discussion around on this subject. MSDN on this page[^] says:
"In general, classes are used to model more complex behavior, or data that is intended to be modified after a class object is created. Structs are best suited for small data structures that contain primarily data that is not intended to be modified after the struct is created."
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
oooooh! Contentious!! Are you saying that if we want to spin our triangle around 360 degrees, we need to 'new' a new Triangle up each time?
Regards,
Rob Philpott.
|
|
|
|
|
Good question! This is where the 'generally' part comes in and the accepted statement that structs should always be immutable falls down.
In this particular situation I would possibly say no it shouldn't be a new triangle - and some parts of the struct may need to be mutable (care would have to be taken with implementation of Equals, ==, != and GetHashCode). The Rectangle struct that is used everywhere and it's Inflate method is an example of a struct that behaves like this - it doesn't return a new Rectangle. Your triangle would need to have a Rotate method that behaves in a similar way.
I can feel a long discussion coming on
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
I'm not sure you are right - I feel that a triangle rotated through any angle is technically a new triangle. Unless the angle is a multiple of 360 degrees then the vertices are different, which implies a new triangle. If you make multiples of 360 degrees a special case, then you lead to inconsistant behaviour (at least in terms of memory use) which may throw up problems later on.
I'd be happier with a consistent new struct each time (and it removes special case processing).
All those who believe in psycho kinesis, raise my hand.
|
|
|
|
|
OriginalGriff wrote: triangle rotated through any angle is technically a new triangle
Its the same object, slighty displaced...so why would it be a new triangle?
There are only 10 types of people in this world — those who understand binary, and those who don't. |
|
|
|
|
|
The displacement makes it a new triangle. Take any triangle, draw it on the screen. Rotate it 30 degrees clockwise. Draw it again. Are they the same?
Take the first triangle, rotate it through 50 degrees anti-clockwise. Draw it. Roate the second triangle through 50 degrees antoclockwise. Draw it. Are they the same?
All those who believe in psycho kinesis, raise my hand.
|
|
|
|
|
On reflection - I agree... see my post below[^]
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
This has prompted me to go away and re-research some of my resoning here (always a good thing).
on this page[^] there is some very intersting discussion (including some from some C# gods) about immutable/mutable structs. Eric Lippert says:
"I would never, ever, EVER write a mutable vector or triangle as a struct. A vector is a VALUE. Values do not change. That is every bit as bizarre as writing a "mutable number". Does it make any sense to say, well, I've got the number 12, but I'm going to change this version of 12 to 15? No, of course not. When you add 3 to a number, you get a NEW NUMBER, you don't _modify_ the number 12 to be a different value.
When you change the vertex of a triangle, you have a _different_ triangle, so it should be a different value."
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
Well, I'd argue that Eric Lippert is wrong. Values *do* change. Of course they do. If that were the case then everything would be a struct and we'd never change anything, but just spend our lives copying member data around.
Regards,
Rob Philpott.
|
|
|
|
|
Rob Philpott wrote: Values *do* change
Only if you use FORTRAN...
All those who believe in psycho kinesis, raise my hand.
|
|
|
|
|
int x = 2;
x = 3;
There you are! x change from 2 to 3. And although one could argue that x is a value type and hence has been replaced, that fact is under the covers they'll be a register pointing to a bit of memory with x in it, and when x changes, that pointer won't, the content will. Your stack would get destroyed otherwise.
Regards,
Rob Philpott.
|
|
|
|
|
Yeah but I've used versions of FORTRAN in the past where the following works:
PROGRAM ARRGH
WRITE(*,*) "Seventeen = ", 17
OMG(17)
WRITE(*,*) "Seventeen = ", 17
CONTAINS
SUBROUTINE OMG(INT I)
I = I + 7
RETURN
END SUBROUTINE OMG
END PROGRAM ARRGH
Output:
Seventeen = 17
Seventeen = 24
:bugger to find:
All those who believe in psycho kinesis, raise my hand.
|
|
|
|
|
I'm glad I don't know FORTRAN. Very glad.
Regards,
Rob Philpott.
|
|
|
|
|
Just think VB with compulsary GOTOs.
Second language they taught us at Uni when I started. Straight after COBOL.
They saved "structured" languages like ALGOL for the second year.
Me? I learned Pascal and assembler in my summer industrial training and never looked back.
In practice, they tried hard to update and improve FORTRAN, but the best thing you could do with it was put the poor old girl down. Any language where you could declare a float and use it as a four dimensional array of characters to modify the OS can't be all bad! (And all without pointers or references)
All those who believe in psycho kinesis, raise my hand.
|
|
|
|
|
Variables change, constants do not and values are contants.
x = 1 + 2
1 and 2 are constant - 1 is always 1 and 2 is always 2, x is variable and so can change if different constants are used to calculate it.
It's value, 3, is constant. If we made it
x = 2 + 3
then x has changed, but 3 hasn't... 3 is still 3! x is now mutated to equal a different constant, 5.
Value types (structs) are meant (apparently) to be treated as values and are therefore constant. Variables using our value type can be made to have a different value but not change the actual value.
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
I've just discussed this with the world's authoritative figure on everything (my Mrs) and she says a Tringle should definately be a struct and immutable so Spin(...) should return a new Triangle .
Discussion closed (well in my house at least as Pride and Prejudice has just come on TV).
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
Do you not use underscores on member variables? I find it makes life so much easier.
Regards,
Rob Philpott.
|
|
|
|
|
I used to, but I found them unnecessary and an annoyance!
If it starts with a lowercase character then its a field (or parameter), if it's uppercase then it's a property (or method). The use of the this keyword allows me to use the field where there is a parameter of the same name which to me is far more distinctive than _ .
Many people also use m_ to indicate it's a member variable.
It's a matter of personal preference really, or the coding styles used in the company you're coding at/for. I've found the style I use the easiest and most logical, but many would disagree!
Dave
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn) Why are you using VB6? Do you hate yourself? (Christian Graus)
|
|
|
|
|
Fair dos. That's the 'coding standard' I have to use at work. But for me, looking at a variable and not knowing at a glance whether its local or member frustrates me a bit. As you say, personal preference.
Regards,
Rob Philpott.
|
|
|
|
|
I wonder if Roger is any less baffled now?
|
|
|
|
|
Nope. But the discussion is interesting.
"A Journey of a Thousand Rest Stops Begins with a Single Movement"
|
|
|
|