Box2D বহুভুজ “সেট ()” ফাংশন ব্যবহার করছেন?


11

আমি বক্স 2 ডি পদার্থবিজ্ঞান ইঞ্জিন ব্যবহার করছি। এবং বাক্স 2 ডি এর জন্য এক ধরণের আকার রয়েছে যাকে বি 2 পলিগনশ্যাপ বলা হয়।

এই শ্রেণিতে, আপনি বহুভুজ তৈরি করতে পারেন। এছাড়াও একটি সেট () ফাংশন রয়েছে যা পয়েন্টগুলির একটি অ্যারে এবং একটি শীর্ষস্থান গণনা গ্রহণ করে।

বক্স 2 ডি এর উদাহরণ রয়েছে:

// This defines a triangle in CCW order.

b2Vec2 vertices[3];

vertices[0].Set(0.0f, 0.0f);

vertices[1].Set(1.0f, 0.0f);

vertices[2].Set(0.0f, 1.0f);

int32 count = 3;



b2PolygonShape polygon;

polygon.Set(vertices, count);

এইটা কাজ করে. তবুও যখন আমি অনুশীলন করার চেষ্টা করেছি এবং এই ফাংশনটির সাথে জগাখিচুড়ি করেছি, তখন আমি এটি করেছি:

  b2Vec2 vertices[4];

  vertices[0].Set(0, 0);
  vertices[1].Set(0,10);
  vertices[2].Set(10,10);
  vertices[3].Set(10,0);

  int32 count = 4;

  b2PolygonShape polygon;

  polygon.Set(vertices, count);

আমি যখন এটি সংকলন করে চালিত করেছি তখন এটি সেট () ফাংশনের পরে ক্র্যাশ হয়ে গেছে। এটি কি একটি বর্গ তৈরি করবে না?

কনসোলেও আমি এটি পেয়েছি:

Assertion failed: s > 0.0f

আমি কি ভুল করছি?

উত্তর:


10

এর কারণ আপনার প্রদত্ত চারটি উলম্বগুলি ঘড়ির কাঁটার দিকে এবং বক্স 2 ডি ধরে ধরেছে যে তারা আপনার প্রথম উদাহরণের মতো ঘড়ির কাঁটার বিপরীতে রয়েছে। সুতরাং আপনি যদি এটিকে পরিবর্তন করেন তবে এটি ঠিক কাজ করা উচিত:

  b2Vec2 vertices[4];

  vertices[0].Set(0, 0);
  vertices[1].Set(10,0);
  vertices[2].Set(10,10);
  vertices[3].Set(0,10);

  int32 count = 4;

  b2PolygonShape polygon;

  polygon.Set(vertices, count);

এবং যাইহোক, আপনি যদি কেবল একটি বাক্স আকৃতির বহুভুজ তৈরি করে থাকেন তবে আপনি সুবিধার ফাংশনটি ব্যবহার করতে পারেন

void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle)

ধরে নেওয়ার উপায় আছে কি না? আমি যা করার চেষ্টা করছি তা হল এমন একটি প্রোগ্রাম তৈরি করা যেখানে আপনি কেবল আকৃতি আঁকতে পারেন, যেমন PHUN এর মতো। এবং এই স্থানেই আমি এই ত্রুটিগুলি এসেছি তাই আমি এটিটি আয়তক্ষেত্র দিয়ে চেষ্টা করার সিদ্ধান্ত নিয়েছি।
xAustechx

1
আসলে তা না. বহুভুজগুলির উত্তল হওয়া দরকার এবং এটি যাচাই করার জন্য এটি ঘুরার ক্রমটি ধরে নেওয়া দরকার। আপনি যদি ফ্লাইতে বহুভুজ আঁকতে এবং তৈরি করতে যাচ্ছেন, তারা ভার্টেক্স গণনা সীমাতে (আমার মনে হয় এটি 6 বা 8 ভার্ট) এর অধীনে রয়েছে কিনা তা নিশ্চিত করার জন্য আপনাকে তাদের প্রাক-প্রক্রিয়া করতে হবে এবং সেই মুহুর্তে আপনি সম্ভবত আপনি বক্স 2 ডি-তে হস্তান্তর করার আগে এগুলি সঠিকভাবে বাতাস করুন।
নোয়েল ললোপিস

0

আপনি বহুভুজটির বাতাস নির্ধারণ করতে পারতেন এবং তারপরে যদি এটি ঘড়ির কাঁটার বিপরীতে থাকে তবে।

একটি সাধারণ পদ্ধতি হ'ল নীচের অ্যালগরিদম ব্যবহার করে বহুভুজের ক্ষেত্রফল গণনা করা। এটি ঘড়ির কাঁটার দিকে ঘোরার জন্য একটি + Ve নম্বর এবং অ্যান্টিক্লকওয়াইভ ওয়াইন্ডিংয়ের জন্য একটি-নম্বর নম্বর প্রদান করবে।

পাইথনের উদাহরণ এখানে:

def poly_area(verts):
    """
    Return area of a simple (ie. non-self-intersecting) polygon.
    Will be negative for counterclockwise winding.
    """
    accum = 0.0
    for i in range(len(verts)):
        j = (i + 1) % len(verts)
        accum += verts[j][0] * verts[i][1] - verts[i][0] * verts[j][1]
    return accum / 2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.