У меня есть Тип класса, который имеет 4 балла (Vector2). Таким образом, форму можно манипулировать в любых целях. Я хочу иметь возможность заполнить эту фигуру цветом, но не знаю, с чего начать. Я нашел ссылки на что-то под названием «VertexPositionColorTexture», но вскоре понял, что это только для 3D-пространства. Моя программа только 2D, и я в недоумении.Как заполнить 2D-форму?
Если у кого-то есть предложения, чтобы добраться до места, где я пытаюсь, я по достоинству оценю помощь.
public class CShape
{
public Vector2 PointA { get; set; }
public Vector2 PointB { get; set; }
public Vector2 PointC { get; set; }
public Vector2 PointD { get; set; }
public Color Color { get; set; }
public float GetWidth()
{
Vector2 Left, Right;
Left = PointA;
if (PointB.X < Left.X) { Left = PointB; }
if (PointC.X < Left.X) { Left = PointC; }
if (PointD.X < Left.X) { Left = PointD; }
Right = PointA;
if (PointB.X > Right.X) { Right = PointB; }
if (PointC.X > Right.X) { Right = PointC; }
if (PointD.X > Right.X) { Right = PointD; }
return (Left.X - Right.X);
}
public float GetHeight()
{
Vector2 Top, Bottom;
Top = PointA;
if (PointB.Y < Top.Y) { Top = PointB; }
if (PointC.Y < Top.Y) { Top = PointC; }
if (PointD.Y < Top.Y) { Top = PointD; }
Bottom = PointA;
if (PointB.Y > Bottom.Y) { Bottom = PointB; }
if (PointC.Y > Bottom.Y) { Bottom = PointC; }
if (PointD.Y > Bottom.Y) { Bottom = PointD; }
return (Top.Y - Bottom.Y);
}
public CShape(Vector2 Location, int Width, int Height, Color Color)
{
PointA = Location;
PointB = new Vector2(PointA.X + Width, PointA.Y);
PointC = new Vector2(PointA.X, PointA.Y + Height);
PointD = new Vector2(PointA.X + Width, PointA.Y + Height);
this.Color = Color;
}
public void Move(Vector2 Velocity)
{
PointA = new Vector2(PointA.X + Velocity.X, PointA.Y + Velocity.Y);
PointB = new Vector2(PointB.X + Velocity.X, PointB.Y + Velocity.Y);
PointC = new Vector2(PointC.X + Velocity.X, PointC.Y + Velocity.Y);
PointD = new Vector2(PointD.X + Velocity.X, PointD.Y + Velocity.Y);
}
public void Draw(SpriteBatch sb)
{
sb.Begin();
SpriteBatchEx.DrawLine(sb, PointA, PointB, Color, 3);
SpriteBatchEx.DrawLine(sb, PointB, PointD, Color, 3);
SpriteBatchEx.DrawLine(sb, PointD, PointC, Color, 3);
SpriteBatchEx.DrawLine(sb, PointC, PointA, Color, 3);
sb.End();
}
}
Спасибо за замечательный ответ. Как я могу заставить VertexPositionColors быть прямо пропорциональным размеру фигуры? Я пытался найти алгоритм в течение нескольких часов. –
Что вам нужно сделать, так это держать вещи в диапазоне от -0,5 до +0,5 во всех осях, вы видите, что мой прямоугольник точно равен 1,0 единицам, как это http://www.csharphelper.com/platonic_3_1.png. Затем вы видите, что мировая матрица основного эффекта имеет масштаб, который масштабирует его. Потому что, используя масштаб 1 при умножении, вы получаете точный размер в пикселях ... надеюсь, что это имеет смысл! PS. поскольку вы делаете 2d, на самом деле не важно устанавливать компоненты Z, я поставил их на ноль. – Aybe
Конечно, массив вершин (или буфер вершин + индекс) должен быть кэширован в классе Shape в реальном коде. Отличный пример: +1. –