Đây là cho nhà thiết kế cấp, hoặc cho động cơ?
Đối với trình thiết kế mức - bạn sẽ cần mã đó để kết hợp các đối tượng tĩnh. Nghiên cứu API đồ họa vector cho giải pháp, tác vụ nghe có vẻ khá phổ biến đối với SVG, PostScript, WMF, v.v. Trước tiên hãy thử sử dụng CombineRgn Win32 API :-)
Đối với công cụ trò chơi - Tôi khuyên bạn không nên làm những gì bạn muốn .. Bạn sẽ dành số lượng lớn CPU kết hợp các đối tượng của mình lại với nhau. Bạn sẽ dành rất nhiều dự đoán sai chi nhánh để kiểm tra các điều kiện biên, kiểm tra xem 2 phân đoạn có giao nhau hay không, v.v. Và, quá trình này phải được lặp lại mỗi khung hình cho phần hiển thị của bản đồ.
Chỉ cần thực hiện kiểm tra hộp giới hạn, sau đó va chạm các đối tượng cá nhân. Nếu hình dạng đối tượng của bạn quá phức tạp - đơn giản hóa chúng trong khi xuất dữ liệu vào động cơ và sử dụng các hình dạng khác nhau để va chạm và vẽ.
Cập nhật : xem mã C # GDI + của tôi thực hiện những gì bạn muốn. Bạn có thể dễ dàng viết tương tự trong C ++: lớp GraphicsPath chỉ đơn thuần là một trình bao bọc mỏng trên các hàm gdiplus.dll tương ứng.
static class GraphicsPathExt
{
[DllImport( @"gdiplus.dll" )]
static extern int GdipWindingModeOutline( HandleRef path, IntPtr matrix, float flatness );
static HandleRef getPathHandle( GraphicsPath p )
{
return new HandleRef( p, (IntPtr)p.GetType().GetField( "nativePath", BindingFlags.NonPublic | BindingFlags.Instance ).GetValue( p ) );
}
public static void FlattenPath( this GraphicsPath p )
{
HandleRef h = getPathHandle( p );
int status = GdipWindingModeOutline( h, IntPtr.Zero, 0.25F );
// TODO: see http://msdn.microsoft.com/en-us/library/ms534175(VS.85).aspx and throw a correct exception.
if( 0 != status )
throw new ApplicationException( "GDI+ error " + status.ToString() );
}
}
class Program
{
static void Main( string[] args )
{
PointF[] fig1 =
{
new PointF(-50, 0),
new PointF(0, 50),
new PointF(50, 0),
};
PointF[] fig2 =
{
new PointF(-50, 25),
new PointF(50, 25),
new PointF(0, -25),
};
GraphicsPath path1 = new GraphicsPath();
path1.AddLines( fig1 );
path1.CloseAllFigures();
GraphicsPath path2 = new GraphicsPath();
path2.AddLines( fig2 );
path2.CloseAllFigures();
GraphicsPath combined = new GraphicsPath();
combined.AddPath( path1, true );
combined.AddPath( path2, true );
combined.FlattenPath();
foreach (var p in combined.PathPoints)
{
Console.WriteLine( "<{0}, {1}>", p.X, p.Y );
}
}
}