অন্য বিন্দু (2 ডি) সম্পর্কে একটি পয়েন্ট ঘোরানো


139

আমি কার্ড কার্ড তৈরি করার চেষ্টা করছি যেখানে কার্ডগুলি ফ্যান হয়ে গেল। এখনই এটি প্রদর্শন করতে আইলেগ্রো এপিআই ব্যবহার করছি যার একটি ফাংশন রয়েছে:

al_draw_rotated_bitmap(OBJECT_TO_ROTATE,CENTER_X,CENTER_Y,X
        ,Y,DEGREES_TO_ROTATE_IN_RADIANS);

সুতরাং এটির সাহায্যে আমি আমার ফ্যানকে সহজেই প্রভাবিত করতে পারি। সমস্যাটি তখন জেনে যাচ্ছে কোন কার্ডটি মাউসের নীচে রয়েছে। এটি করার জন্য আমি বহুভুজের সংঘর্ষ পরীক্ষা করার কথা ভেবেছিলাম। বহুভুজটি তৈরি করতে কার্ডের 4 টি পয়েন্ট কীভাবে ঘোরানো যায় তা সম্পর্কে আমি ঠিক নিশ্চিত নই। আমার মূলত অ্যালেগ্রোর মতোই অপারেশন করা দরকার।

উদাহরণস্বরূপ, কার্ডের 4 টি পয়েন্ট:

card.x

card.y

card.x + card.width

card.y + card.height

আমার যেমন একটি ফাংশন প্রয়োজন:

POINT rotate_point(float cx,float cy,float angle,POINT p)
{
}

ধন্যবাদ

উত্তর:


331

প্রথমে পিভট পয়েন্টটি বিয়োগ করুন (cx,cy), তারপরে এটি ঘোরান, তারপরে আবার পয়েন্ট যুক্ত করুন।

অপরীক্ষিত:

POINT rotate_point(float cx,float cy,float angle,POINT p)
{
  float s = sin(angle);
  float c = cos(angle);

  // translate point back to origin:
  p.x -= cx;
  p.y -= cy;

  // rotate point
  float xnew = p.x * c - p.y * s;
  float ynew = p.x * s + p.y * c;

  // translate point back:
  p.x = xnew + cx;
  p.y = ynew + cy;
  return p;
}

45
দুর্দান্ত উত্তর। রেকর্ডের জন্য, আপনি প্রথমবার ঘূর্ণনটি সঠিকভাবে পেয়েছেন।
এনকোলিনস

@ সিনক্রোনাইজার ঠিক একই রকম, কেবল আপনার পয়েন্ট বিয়োগ / সংযোজন রুটিন এবং আপনার ভেক্টর * ঘূর্ণনের জন্য ম্যাট্রিক্স ফাংশন ব্যবহার করুন।
নিলস পিপেনব্রিংক

8
অজ্ঞদের উল্লেখ করতে সহায়ক হতে পারে যে পাপ এবং কোস রেডিয়ানগুলিতে কোণ প্রকাশের আশা করতে পারে।
15ee8f99-57ff-4f92-890c-b56153

72

যদি আপনি কোণে পয়েন্টের (px, py)চারপাশে পয়েন্ট ঘোরান তবে আপনি (ox, oy)পাবেন:

p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox

p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy

এটি 2D এ পয়েন্টটি ঘোরানোর একটি সহজ উপায়।


7
ঘোরার পরে আপনাকে আবার অনুবাদ করতে হবে। p'x + + = বলদ: তাই সমাধান হবে
Hale

57

স্ক্রিনের স্থানাঙ্ক সিস্টেমটি বাম-হাত, অর্থাৎ এক্স স্থানাঙ্কটি বাম থেকে ডানে বৃদ্ধি পায় এবং y স্থানাঙ্ক শীর্ষ থেকে নীচে বৃদ্ধি পায়। উত্স, ও (0, 0) পর্দার উপরের বাম কোণে।

এখানে চিত্র বর্ণনা লিখুন

স্থানাঙ্ক (x, y) সহ একটি বিন্দুর উত্সের চারদিকে একটি ঘড়ির কাঁটার ঘূর্ণন নিম্নোক্ত সমীকরণ দ্বারা দেওয়া হয়:

এখানে চিত্র বর্ণনা লিখুন

যেখানে (x ', y') হল ঘূর্ণন এবং কোণ থীটার পরে বিন্দুটির স্থানাঙ্ক, ঘূর্ণনের কোণ (রেডিয়ানে হওয়া প্রয়োজন, অর্থাত্ গুণ: পিআই / 180)।

মূল O (0,0) থেকে আলাদা একটি বিন্দুর চারপাশে ঘূর্ণন সম্পাদন করতে, আসুন বিন্দু A (a, b) (পিভট পয়েন্ট) বলি। প্রথমত আমরা পিভট পয়েন্টের স্থানাঙ্কগুলি (x - a, y - b) বিয়োগ করে ঘোরার বিন্দুটিকে অর্থ হিসাবে (x, y) উত্সে ফিরে অনুবাদ করি। তারপরে আমরা ঘূর্ণনটি সম্পাদন করি এবং নতুন স্থানাঙ্ক (এক্স ', y') পাই এবং শেষ পর্যন্ত আমরা পিওড পয়েন্টের স্থানাঙ্কগুলি নতুন স্থানাঙ্কগুলিতে (x '+ a, y' + বি) যোগ করে ফিরে পয়েন্টটি অনুবাদ করি।

উপরোক্ত বিবরণ অনুসরণ:

একটি 2 ডি ঘড়ির কাঁটার দিকে থেটা ডিগ্রী বিন্দু আবর্তনের (X, Y) বিন্দুর চারিদিকে (ক, খ) হল:

আপনার ফাংশন প্রোটোটাইপ ব্যবহার করে: (x, y) -> (px, পাই); (a, b) -> (cx, cy); থিতা -> কোণ:

POINT rotate_point(float cx, float cy, float angle, POINT p){

     return POINT(cos(angle) * (p.x - cx) - sin(angle) * (p.y - cy) + cx,
                  sin(angle) * (p.x - cx) + cos(angle) * (p.y - cy) + cy);
}

29
float s = sin(angle); // angle is in radians
float c = cos(angle); // angle is in radians

ঘড়ির কাঁটার ঘোরার জন্য:

float xnew = p.x * c + p.y * s;
float ynew = -p.x * s + p.y * c;

ঘড়ির কাঁটা পাল্টানোর জন্য:

float xnew = p.x * c - p.y * s;
float ynew = p.x * s + p.y * c;


1
@ ট্যানকোরস্যামশ এর উপরের সংজ্ঞায়িতc = cos(angle)
nycynik

2

এটি নীল পিপেনব্রিন্কের উত্তর, তবে সি # ফিডেলে প্রয়োগ করা হয়েছে।

https://dotnetfiddle.net/btmjlG

using System;

public class Program
{
    public static void Main()
    {   
        var angle = 180 * Math.PI/180;
        Console.WriteLine(rotate_point(0,0,angle,new Point{X=10, Y=10}).Print());
    }

    static Point rotate_point(double cx, double cy, double angle, Point p)
    {
        double s = Math.Sin(angle);
        double c = Math.Cos(angle);
        // translate point back to origin:
        p.X -= cx;
        p.Y -= cy;
        // rotate point
        double Xnew = p.X * c - p.Y * s;
        double Ynew = p.X * s + p.Y * c;
        // translate point back:
        p.X = Xnew + cx;
        p.Y = Ynew + cy;
        return p;
    }

    class Point
    {
        public double X;
        public double Y;

        public string Print(){
            return $"{X},{Y}";
        }
    }
}

PS: আপাতদৃষ্টিতে আমি কোনও মন্তব্য করতে পারি না, সুতরাং এটির উত্তর হিসাবে পোস্ট করা আমার বাধ্য ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.