31 using System.ComponentModel;
35 using Microsoft.Xna.Framework;
36 using Microsoft.Xna.Framework.Graphics;
39 using XnaColor = Microsoft.Xna.Framework.Color;
120 Texture2D texture = image.XNATexture;
121 IBitmap bm =
new TextureBitmap( texture );
122 Vector2D[] vertices = VertexHelper.CreateFromBitmap( bm );
124 for (
int i = 0; i < vertices.Length; i++ )
126 vertices[i].X /= texture.Width;
127 vertices[i].Y /= texture.Height;
131 vertices[i] -=
new Vector2D( (
float)0.5, (
float)0.5 );
135 for (
int i = 0; i < vertices.Length; i++ )
136 polygonVertices[i] =
new Vector( vertices[i].
X, vertices[i].
Y );
148 Type shapeClass = typeof(
Shape );
149 BindingFlags flags = BindingFlags.GetField | BindingFlags.Public | BindingFlags.Static;
150 FieldInfo selectedShape = shapeClass.GetField( shapeStr, flags );
151 return (
Shape)selectedShape.GetValue( null );
161 if ( vertexCount < 3 )
throw new ArgumentException(
"You need at least 3 vertices to create a polygon!" );
162 return new RegularPolygon( vertexCount );
165 internal static ShapeCache CreateRegularPolygonCache(
int vertexCount )
167 double angleStep = 2 * Math.PI / vertexCount;
168 Int16 centerIndex = (Int16)vertexCount;
172 Int16[] outlineIndices =
new Int16[vertexCount];
174 for (
int i = 0; i < vertexCount; i++ )
176 double a = i * angleStep;
177 vertices[i] =
new Vector( 0.5 * Math.Cos( a ), 0.5 * Math.Sin( a ) );
178 outlineIndices[i] = (Int16)i;
182 for (
int i = 0; i < vertexCount - 1; i++ )
184 triangles[i] =
new IndexTriangle( (Int16)i, centerIndex, (Int16)( i + 1 ) );
186 triangles[vertexCount - 1] =
new IndexTriangle( (Int16)( vertexCount - 1 ), centerIndex, (Int16)0 );
188 return new ShapeCache( vertices, triangles, outlineIndices );
195 return cp1 * cp2 >= 0;
212 double invDenom = 1 / ( dot00 * dot11 - dot01 * dot01 );
213 double u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;
214 double v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;
216 return ( u >= 0 ) && ( v >= 0 ) && ( u + v < 1 );
223 for (
int i = 0; i < Cache.
Triangles.Length; i++ )
259 return x * x + y * y <= r;
272 if ( Cache != null && Cache.
Triangles != null )
295 private static ShapeCache _cache = CreateRegularPolygonCache( 64 );
299 get {
return _cache; }
306 public override bool IsInside(
double x,
double y )
317 private static readonly
Vector[] vertices =
new Vector[]
331 private static readonly Int16[] outlineIndices =
new Int16[]
336 private static readonly
ShapeCache _cache =
new ShapeCache( vertices, triangles, outlineIndices );
338 internal override ShapeCache Cache {
get {
return _cache; } }
344 public override bool IsInside(
double x,
double y )
346 return ( Math.Abs( x ) <= 1 && Math.Abs( y ) <= 1 );
355 private static readonly
Vector[] vertices =
new Vector[]
383 internal override ShapeCache Cache {
get {
return _cache; } }
395 private static readonly
Vector[] vertices =
new Vector[]
419 private static readonly Int16[] outlineIndices =
new Int16[]
421 2, 9, 8, 7, 6, 5, 4, 3, 1, 0
424 private static readonly
ShapeCache _cache =
new ShapeCache( vertices, triangles, outlineIndices );
426 internal override ShapeCache Cache {
get {
return _cache; } }
438 private static readonly
Vector[] vertices =
new Vector[]
450 private static readonly Int16[] outlineIndices =
new Int16[]
455 private static readonly
ShapeCache _cache =
new ShapeCache( vertices, triangles, outlineIndices );
457 internal override ShapeCache Cache {
get {
return _cache; } }
463 public override bool IsInside(
double x,
double y )
476 get {
throw new Exception(
"Cache is not defined for RaySegment" ); }
487 this.Origin = origin;
488 this.Direction = direction;
489 this.Length = length;
498 private bool isUnitSize =
true;
508 get {
return isUnitSize; }
513 get {
return _cache; }
517 : this( cache, true )
524 this.isUnitSize = isUnitSize;
531 internal class RegularPolygon :
Polygon 533 public int CornerCount {
get;
internal set; }
534 public override bool IsUnitSize {
get {
return true; } }
536 public RegularPolygon(
int vertexCount )
537 : base( CreateRegularPolygonCache( vertexCount ) )
539 CornerCount = vertexCount;
546 [EditorBrowsable( EditorBrowsableState.Never )]
552 public Int16 i1, i2,
i3;
568 : this( (Int16)i1, (Int16)i2, (Int16)i3 )
576 [EditorBrowsable( EditorBrowsableState.Never )]
606 this.Vertices = this.OutlineVertices = outlineVertices;
607 Triangles = triangles;
617 this.Vertices = this.OutlineVertices = outlineVertices;
618 this.Triangles = null;
630 Triangles = triangles;
632 OutlineVertices =
new Vector[outlineIndices.Length];
633 for (
int i = 0; i < outlineIndices.Length; i++ )
635 OutlineVertices[i] = vertices[outlineIndices[i]];
644 internal class TextureBitmap : IBitmap
649 protected bool[,] bitmap;
656 public TextureBitmap( Texture2D texture, Predicate<XnaColor> isOpaque )
661 bitmap =
new bool[texture.Width, texture.Height];
663 for (
int i = 0; i < texture.Height; i++ )
667 texture.GetData<
XnaColor>( 0, srcRect, scanline, 0, texture.Width );
669 for (
int j = 0; j < texture.Width; j++ )
673 bitmap[j, texture.Height - i - 1] = isOpaque( scanline[j] );
683 public TextureBitmap( Texture2D texture )
684 :
this( texture, IsOpaqueColor )
693 get {
return bitmap.GetLength( 0 ); }
701 get {
return bitmap.GetLength( 1 ); }
707 public bool this[
int x,
int y]
711 if ( x < 0 || y < 0 || x >= Width || y >= Height ) {
return false; }
722 public static bool IsOpaqueColor(
XnaColor c )
724 return ( c.A >= 127 );
ShapeCache(Vector[] outlineVertices)
Luo kuvion pelkillä reuna-vertekseillä. Kuviolle ei tule tietoa kolmioista, näin ollen sitä ei voi tä...
static Shape CreateRegularPolygon(int vertexCount)
Luo säännöllisen monikulmion (polygonin)
ShapeCache(Vector[] outlineVertices, IndexTriangle[] triangles)
Luo kuvion kolmioilla, joiden avulla kuvio voidaan täyttää värillä. Kaikkien verteksien tulee olla ku...
static readonly Shape Hexagon
Heksagoni eli kuusikulmio.
readonly Vector [] OutlineVertices
Ulkoreunan verteksit, lueteltuna vastapäivään.
bool IsInsideCircle(double x, double y, double r)
readonly Vector [] Vertices
Kaikki verteksit, ml. kolmioiden kulmapisteet.
override bool IsInside(double x, double y)
Onko piste muodon sisällä. Pisteen koordinaatiston origo on muodon keskellä. Muoto on kokoa 1x1 jos I...
static bool IsInsideTriangle(Vector p, Vector a, Vector b, Vector c)
static readonly Shape Diamond
Timantti- / salmiakkikuvio
static readonly Heart Heart
Sydän.
static readonly Ellipse Ellipse
Ellipsi tai ympyrä.
static readonly Rectangle Rectangle
Suorakulmio.
Polygon(ShapeCache cache)
bool IsInsideTriangles(Vector p)
IndexTriangle(Int16 i1, Int16 i2, Int16 i3)
Luo uuden kolmion. Parametreina kulmapisteiden indeksit lueteltuna myötäpäivään.
readonly IndexTriangle [] Triangles
Kolmiot, joiden avulla kuvio voidaan täyttää värillä.
static readonly Star Star
Tähti.
static readonly Vector Zero
Nollavektori.
virtual bool IsInside(double x, double y)
Onko piste muodon sisällä. Pisteen koordinaatiston origo on muodon keskellä. Muoto on kokoa 1x1 jos I...
override bool IsInside(double x, double y)
Onko piste muodon sisällä. Pisteen koordinaatiston origo on muodon keskellä. Muoto on kokoa 1x1 jos I...
static readonly Triangle Triangle
Tasasivuinen kolmio.
Polygon(ShapeCache cache, bool isUnitSize)
static bool SameSide(Vector a, Vector b, Vector p1, Vector p2)
Sisältää valmiiksi lasketut kolmiot, joiden avulla piirtäminen on suoraviivaista. ...
static double CrossProduct(Vector left, Vector right)
Ristitulo. Palauttaa kohtisuoraan vektoreita vastaan olevan uuden vektorin pituuden. Tuloksen merkki kertoo kumpaan suuntaan vektori osoittaa.
static readonly Ellipse Circle
Ympyrä tai ellipsi.
static double DotProduct(Vector left, Vector right)
Pistetulo.
IndexTriangle(int i1, int i2, int i3)
Luo uuden kolmion. Parametreina kulmapisteiden indeksit lueteltuna myötäpäivään.
bool IsInsideOutlines(Vector p)
static readonly Shape Pentagon
Pentagoni eli viisikulmio.
ShapeCache(Vector[] vertices, IndexTriangle[] triangles, Int16[] outlineIndices)
Luo kuvion, joka voidaan piirtää täytettynä värillä.
Microsoft.Xna.Framework.Rectangle XnaRectangle
static Shape FromString(string shapeStr)
Luo muodon merkkijonosta, esim. "Circle"
RaySegment(Vector origin, Vector direction, double length)
static Shape FromImage(Image image)
Luo kuvion annetusta kuvasta. Kuvassa tulee olla vain yksi yhtenäinen muoto (toisin sanoen kuvio ei v...
override bool IsInside(double x, double y)
Onko piste muodon sisällä. Pisteen koordinaatiston origo on muodon keskellä. Muoto on kokoa 1x1 jos I...
Muotojen määrityksessä käytettävä kolmio.
static readonly Shape Octagon
Oktagoni eli kahdeksankulmio.
abstract bool IsUnitSize
If true, the shape must be scaled by the size of the object that has the shape. Typically, an unit-sized object has width and height of 1.0.