|
"I thought you needed a wrapper for OpenGL" - I do indeed. I will download SharpGL from the link I mentioned and give it a go. I guess I would have felt a nice warm feeling inside if the code had a website associated with it, with documentation and forums and the like. But as it is free, I can't really complain, can I?
Thanks again for the help.
-Patrick
|
|
|
|
|
You're welcome
|
|
|
|
|
You might want to look at The Open Toolkit[^]. It wraps OpenGL, OpenCL and OpenAL and runs on Linux as well as Windows (i.e. Mono).
"WPF has many lovers. It's a veritable porn star!" - Josh Smith As Braveheart once said, "You can take our freedom but you'll never take our Hobnobs!" - Martin Hughes.
My blog | My articles | MoXAML PowerToys | Onyx
|
|
|
|
|
I have just had a quick look. Very interesting. Thanks for the pointer.
-Patrick
|
|
|
|
|
A question ...
I have 2 classes .. in a class1 (form) I call a function, situated in class2, for draw an image. In the middle of this function, i want send an event to class1 (for invalidate a rect etc) ... can you help me, with an example, to implement an event handler?
thanks a lot.
Alex
|
|
|
|
|
public class Class1
{
private Class2 class2;
public Class1()
{
class2 = new Class2();
class2.Class2Event += new EventHandler(class2_Class2Event);
class2.Class2Function();
}
void class2_Class2Event(object sender, EventArgs e)
{
}
}
public class Class2
{
public event EventHandler Class2Event;
public void Class2Function()
{
OnClass2Event(EventArgs.Empty);
}
protected virtual void OnClass2Event(EventArgs e)
{
EventHandler eh = Class2Event;
if (eh != null)
eh(this, e);
}
}
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)
|
|
|
|
|
thanks a lot!
Alex
|
|
|
|
|
|
While trying to create a Triangle class - a general purpose marker that accepts a location, size, and rotation angle - I keep running into access violations. I don't understand why.
The class declaration includes:
namespace ShapesLibrary
{
class Triangle
{
private Point Anchor;
private Point Vertex1;
private Point Vertex2;
private Point Vertex3;
It's only a partial list, but it shows the relevant details. The constructor for the class includes:
public Triangle(Point anchor, Int32 radius, float angle)
{
Anchor=anchor;
Radius=radius;
Angle=angle;
Vertex1.X = Convert.ToInt32(Radius*Math.Cos(Angle));
Vertex1.Y= Convert.ToInt32(Radius*Math.Sin(Angle));
Vertex2.X = Convert.ToInt32(Radius*Math.Cos(Angle+120));
Vertex2.Y= Convert.ToInt32(Radius*Math.Sin(Angle+120));
Vertex3.X = Convert.ToInt32(Radius*Math.Cos(Angle+240));
Vertex3.Y = Convert.ToInt32(Radius*Math.Sin(Angle+240));
So far, so good; no errors emitted thus far. Now, I don't want users recalculating where the vertices are, so I don't want these members to be public, but I do want them to be able to find them. I first added a 'get' accessor to each of them, but that created an error in the Constructor, telling me that VertexN is not a variable. So I added a group of member functions to read the values, to wit:
public Point GetVertex1
{
return Vertex1;
}
public Point GetVertex2
{
return Vertex2;
}
public Point GetVertex3
{
return Vertex3;
Doing this generated errors that told me that a 'get' or 'set' accessor is required. Obviously I'm missing some important concept here. I thought that a private variable is accessible by all members of a class, and that I should be able to return such a value from a class method that is declared public. Apparently not...
What am I missing here?
"A Journey of a Thousand Rest Stops Begins with a Single Movement"
|
|
|
|
|
Try the following:
private Point _vertex1;
public Point Vertex1
{
get
{
return _vertex1;
}
set
{
_vertex1 = value;
}
}
|
|
|
|
|
Roger Wright wrote: public Point GetVertex1 { return Vertex1; }
As far as the error is concerned, this should fix it for you.
public Point GetVertex1 <br />
{<br />
get { return Vertex1; }<br />
}
Roger Wright wrote: thought that a private variable is accessible by all members of a class
A private variable would be accessible to all members inside a class. However, when you are defining a property, you are basically defining a get / set pair, or a get (for a readonly property). In short, the get / set accessor error is caused because the compiler needs syntax written that way. For some more information, try going through this link[^].
There are only 10 types of people in this world — those who understand binary, and those who don't. |
modified on Sunday, January 3, 2010 4:13 AM
|
|
|
|
|
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.
|
|
|
|