তিনটি পয়েন্ট থেকে একটি কোণ গণনা কিভাবে? [বন্ধ]


120

বলুন আপনার কাছে এটি রয়েছে:

P1 = (x=2, y=50)
P2 = (x=9, y=40)
P3 = (x=5, y=20)

ধরুন এটি P1একটি বৃত্তের কেন্দ্রবিন্দু। এটা সবসময় একই। আমি কোণ যে গঠিত চান P2এবং P3, বা অন্য কথায় কোণ যে পরবর্তী P1। অভ্যন্তরীণ কোণটি সুনির্দিষ্ট হতে হবে। এটি সর্বদা একটি তীব্র কোণ হবে, সুতরাং -90 ডিগ্রির চেয়ে কম।

আমি ভেবেছিলাম: মানুষ, এটাই সহজ জ্যামিতির গণিত। তবে আমি এখন প্রায় 6 ঘন্টার জন্য একটি সূত্রটি সন্ধান করেছি এবং কেবলমাত্র নাসা জটিল আরক্কোস এবং ভেক্টর স্কেলার পণ্য সামগ্রীর বিষয়ে কথা বলার লোককে খুঁজে পাই। আমার মাথাটি মনে হচ্ছে এটি কোনও ফ্রিজে রয়েছে।

কিছু গণিত গুরু এখানে যারা মনে করেন এটি একটি সাধারণ সমস্যা? আমি মনে করি না যে এখানে প্রোগ্রামিং ভাষার বিষয়টি গুরুত্বপূর্ণ, তবে যারা মনে করেন এটি এটি করে: জাভা এবং উদ্দেশ্য-গ। আমার উভয়ের জন্য এটি দরকার, তবে এটির জন্য এটি ট্যাগ করে নি।

উত্তর:


87

আপনার যদি বোঝানো হয় যে P1 কোসাইনস আইন ব্যবহার করে এর প্রান্তবিন্দু হয় তবে এটি ব্যবহার করা উচিত:

arccos((পি 12 2 + পি 13 2 - পি 23 2 ) / (2 * পি 12 * পি 13 ))

যেখানে পি 12 হল পি 1 থেকে পি 2 পর্যন্ত সেগমেন্টের দৈর্ঘ্য, দ্বারা গণনা করা হয়েছে

স্কয়ার্ট ((পি 1 এক্স - পি 2 এক্স ) 2 + (পি 1 - পি 2 ) 2 )



@ রাফা ফায়ারনেজ কোস 1 -1 এ আকোসের একটি সাধারণ স্বরলিপি, তবে অ্যাকোস কম অস্পষ্ট। en.wikedia.org/wiki/Inverse_trigonometric_funitions
geon

আমি সম্পাদনাটি ছেড়ে যাব কারণ এটি কোনওরকম ক্ষতি করে না, তবে গণিত / সিএস / ইই ডিগ্রি থাকা, কোস্ট ^ -1 অবশ্যই সবচেয়ে সাধারণ স্বরলিপি।
ল্যান্স রবার্টস

1
কেবলমাত্র কয়েকটি মুষ্টিমেয় ভাষাগুলি 'পাওয়ার অফ' এর জন্য একটি ক্যারেট ব্যবহার করে, তাই আপনি যদি এটি আরকোস বলতে না চান তবে দয়া করে কেবল টাইপ করুন ⁻¹ (আপনি যদি এমন কোনও বাণিজ্যিক অপারেটিং সিস্টেম ব্যবহার করছেন যা এক্সপোশনগুলি টাইপ করতে অসুবিধা সৃষ্টি করে তবে আমি আশা করি যে আপনি কিনতে পারেন এমন কী-ক্যাপস অ্যাপ্লিকেশন থাকতে পারে বা আপনি ব্রাউজার প্লাগ-ইন ইনস্টল করতে পারেন Or অথবা আপনি ওয়েবসার্ক করে কপি এবং পেস্ট করতে পারেন))
মাইকেল শ্যাপার

1
@ মিশেলশেপার, আমি মন্তব্যগুলিতে কেবল ক্যারেটটি ব্যবহার করছিলাম যেখানে এইচটিএমএল সীমাবদ্ধ। আমি অবশ্যই কোনও বাস্তব উত্তরে সাব / সুপারস্ক্রিপ্ট স্বরলিপিটি ব্যবহার করব।
ল্যান্স রবার্টস

47

এটি খুব সহজ হয়ে যায় যদি আপনি এটি দুটি ভেক্টর হিসাবে মনে করেন, একটি বিন্দু P1 থেকে P2 এবং একটি P1 থেকে P3 পর্যন্ত

সুতরাং:
a = (p1.x - p2.x, p1.y - p2.y)
বি = (p1.x - p3.x, p1.y - p3.y)

এরপরে আপনি ডট পণ্য সূত্রটি উল্টাতে পারেন:
বিন্দু পণ্য
কোণটি পেতে:
দুটি ভেক্টরের মধ্যে কোণ angle

মনে রাখবেন যে বিন্দু পণ্যঠিক অর্থ: এ 1 * বি 1 + এ 2 * বি 2 (এখানে মাত্র 2 টি মাত্রা ...)


1
ভেক্টরের আহ পরিধি
ড্যানিয়েল লিটল

Atan2 সমাধান পরীক্ষা করে দেখুন।
লুক বোয়েসেই

25

কোণ গণনার সাথে মোকাবিলা করার সর্বোত্তম উপায় হ'ল atan2(y, x)বিন্দুটি x, yদিয়ে বিন্দুটি X+মূল থেকে শুরু করে এবং উত্সের ক্ষেত্রে অক্ষটি ব্যবহার করে use

গণনা যে দেওয়া

double result = atan2(P3.y - P1.y, P3.x - P1.x) -
                atan2(P2.y - P1.y, P2.x - P1.x);

অর্থাৎ আপনি মূলত দ্বারা দুই পয়েন্ট অনুবাদ -P1(অন্য কথায় আপনি এখন যে সবকিছু অনুবাদ P1এবং তারপর আপনি পরম কোণ পার্থক্য বিবেচনা উত্স প্রান্ত পর্যন্ত) P3এবং P2

এর সুবিধাটি atan2হ'ল সম্পূর্ণ বৃত্তটি উপস্থাপিত হয় (আপনি -π এবং between এর মধ্যে যে কোনও সংখ্যা পেতে পারেন) পরিবর্তে acosআপনাকে সঠিক ফলাফল গণনা করার লক্ষণগুলির উপর নির্ভর করে বেশ কয়েকটি কেস পরিচালনা করতে হবে।

এর একমাত্র একক পয়েন্ট atan2হ'ল (0, 0)... এর অর্থ যে উভয় P2এবং P3অবশ্যই পৃথক হওয়া উচিত P1কারণ এ ক্ষেত্রে একটি কোণ সম্পর্কে কথা বলার অর্থ নেই।


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

@ মার্কেট: atan2এই সমস্যার জন্য ঠিক যা প্রয়োজন তা হ'ল, তবে দেখে মনে হচ্ছে বেশিরভাগ লোকেরা এই প্রশ্নে উঠছেন কেবল পড়তে পারেন না বা বুঝতে পারবেন না কেন acosভিত্তিক সমাধানটি খারাপ। ভাগ্যক্রমে আমার জন্য যথেষ্ট "আমি ইন্টারনেটে কেউ ভুল" ( xkcd.com/386 ) পর্যায়টি বেশ কয়েক বছর আগে রেখেছিলাম এবং আমি
6502

এটি নির্দেশ করার জন্য ধন্যবাদ, তবে আপনি কি এইভাবে 3 ডি পরিচালনা করতে পারেন?
নিকোকো

1
@nicoco: তিনটি মাত্রায় আপনি কোণটি কীভাবে সংজ্ঞায়িত করবেন? কোণটি আরও নির্দিষ্টভাবে নেতিবাচক বা পাই (180 ডিগ্রি) এর চেয়ে বেশি হতে পারে? 3 ডি তে দুটি অ সমান্তরাল ভেক্টর একটি প্লেনকে সংজ্ঞায়িত করে, তবে বিমানটি দুটি পক্ষ থেকে "দেখা" যেতে পারে: একদিকের দিকে A বি এর "বাম দিকে" উপস্থিত হবে এবং অন্য দিক থেকে এটি "ডানদিকে" উপস্থিত হবে .. ।
6502

@ 6505 আপনার উত্তরের জন্য ধন্যবাদ, আমি আমার সমস্যাটি ভেবে দেখার আগে পোস্ট করেছি। যদিও আমি এখন তা খুঁজে পেয়েছি।
নিকোকো

19

আমাকে জাভাস্ক্রিপ্টে একটি উদাহরণ দেই, আমি এর সাথে অনেক লড়াই করেছি:

/**
 * Calculates the angle (in radians) between two vectors pointing outward from one center
 *
 * @param p0 first point
 * @param p1 second point
 * @param c center point
 */
function find_angle(p0,p1,c) {
    var p0c = Math.sqrt(Math.pow(c.x-p0.x,2)+
                        Math.pow(c.y-p0.y,2)); // p0->c (b)   
    var p1c = Math.sqrt(Math.pow(c.x-p1.x,2)+
                        Math.pow(c.y-p1.y,2)); // p1->c (a)
    var p0p1 = Math.sqrt(Math.pow(p1.x-p0.x,2)+
                         Math.pow(p1.y-p0.y,2)); // p0->p1 (c)
    return Math.acos((p1c*p1c+p0c*p0c-p0p1*p0p1)/(2*p1c*p0c));
}

বোনাস: এইচটিএমএল 5-ক্যানভাস সহ উদাহরণ


5
আপনি কম sqrtএবং স্কোয়ারিং করে এটিকে আরও দক্ষ করে তুলতে পারেন । দেখুন আমার উত্তর এখানে (রুবি লেখা), অথবা এই আপডেট ডেমো (জাভাস্ক্রিপ্ট)।
ফ্রোগজ

একটি সহজ সমাধানের জন্য আপনি atan2 ব্যবহার করতে পারেন।
লুক বোসায়ি

15

মূলত আপনার কাছে যা আছে দুটি ভেক্টর, একটি ভেক্টর পি 1 থেকে পি 2 এবং অন্যটি পি 1 থেকে পি 3 পর্যন্ত। সুতরাং আপনাকে কেবল দুটি ভেক্টরের মধ্যবর্তী কোণটি গণনা করার জন্য একটি সূত্র প্রয়োজন।

একটি ভাল ব্যাখ্যা এবং সূত্র জন্য এখানে একবার দেখুন ।

বিকল্প পাঠ


12

আপনি যদি P1 কে একটি বৃত্তের কেন্দ্র হিসাবে ভাবছেন তবে আপনি খুব জটিল ভাবছেন। আপনার একটি সাধারণ ত্রিভুজ রয়েছে, সুতরাং আপনার সমস্যাটি কোসাইনের আইন অনুসারে সমাধানযোগ্য । কোনও পোলার স্থানাঙ্ক ট্রান্সফর্মেশন বা সামসুচের দরকার নেই। দূরত্বগুলি P1-P2 = A, P2-P3 = B এবং P3-P1 = C বলে:

কোণ = আরকোস ((B ^ 2-A ^ 2-C ^ 2) / 2AC)

আপনাকে কেবলমাত্র এ, বি এবং সি দূরত্বের দৈর্ঘ্য গণনা করতে হবে যা আপনার পয়েন্ট এবং পাইথাগ্রোর উপপাদ্যের এক্স- এবং ওয়াই-কো-অর্ডিনেট থেকে সহজেই পাওয়া যায় Those

দৈর্ঘ্য = স্কয়ার্ট ((এক্স 2-এক্স 1) ^ 2 + (ওয়াই 2-ওয়াই 1) ^ 2)


আমি কিছুটা বিভ্রান্ত হচ্ছি আপনি কীভাবে এটি বাস্তবায়ন করবেন কারণ আপনি পি 1 ইত্যাদি (x, y) এর চেয়ে পৃথক মান হিসাবে বিবেচনা করছেন
ডমিনিক

@ ডমিনিক টোবিয়াস: নোটেশনটি P1-P2 = A"এ গণনা করতে, পি 1 থেকে পি 2 বিয়োগ" হিসাবে পড়া উচিত নয়, তবে "আমি পি 1 থেকে পি 2 এর দূরত্ব হিসাবে এটিকে সংজ্ঞায়িত করছি", যা পরে দ্বিতীয় সমীকরণটি ব্যবহার করে গণনা করা যেতে পারে। আমি কেবল দূরত্বগুলির জন্য একটি সংক্ষিপ্তকরণ সংজ্ঞায়িত করতে চেয়েছিলাম, সমীকরণগুলি আরও পাঠযোগ্য।
ট্র্যাব

8

আমি সম্প্রতি একটি অনুরূপ সমস্যার মধ্যে দৌড়েছি, কেবলমাত্র আমার একটি ইতিবাচক এবং নেতিবাচক কোণগুলির মধ্যে পার্থক্য করা দরকার। এটি কারওর ব্যবহারের ক্ষেত্রে, আমি অ্যান্ড্রয়েডের জন্য একটি স্পর্শ ইভেন্টের উপর ঘূর্ণন সনাক্তকরণ সম্পর্কে এই মেলিং তালিকাটি থেকে ধরেছি কোড স্নিপেটটি সুপারিশ করছি :

 @Override
 public boolean onTouchEvent(MotionEvent e) {
    float x = e.getX();
    float y = e.getY();
    switch (e.getAction()) {
    case MotionEvent.ACTION_MOVE:
       //find an approximate angle between them.

       float dx = x-cx;
       float dy = y-cy;
       double a=Math.atan2(dy,dx);

       float dpx= mPreviousX-cx;
       float dpy= mPreviousY-cy;
       double b=Math.atan2(dpy, dpx);

       double diff  = a-b;
       this.bearing -= Math.toDegrees(diff);
       this.invalidate();
    }
    mPreviousX = x;
    mPreviousY = y;
    return true;
 }

7

ব্যাখ্যার সাথে খুব সরল জ্যামিতিক সমাধান

কয়েক দিন আগে, একজন একই সমস্যায় পড়েছিল এবং গণিতের বইটি নিয়ে বসেছিলেন। আমি কিছু বেসিক সূত্রগুলি একত্রিত ও সরল করে সমস্যার সমাধান করেছি।


আসুন এই চিত্রটি বিবেচনা করুন-

কোণ

আমরা জানতে চাই Θ , তাই আমরা খুঁজে বের করতে হবে α এবং বিটা প্রথম। এখন, কোনও সরল রেখার জন্য-

y = m * x + c

চলুন- এ = (কুড়াল, আই ) , বি = (বিএক্স, বাই) , এবং ও = (ষাঁড়, ওয়) । সুতরাং ওএ লাইনের জন্য -

oy = m1 * ox + c   ⇒ c = oy - m1 * ox   ...(eqn-1)

ay = m1 * ax + c   ⇒ ay = m1 * ax + oy - m1 * ox   [from eqn-1]
                   ⇒ ay = m1 * ax + oy - m1 * ox
                   ⇒ m1 = (ay - oy) / (ax - ox)
                   ⇒ tan α = (ay - oy) / (ax - ox)   [m = slope = tan ϴ]   ...(eqn-2)

একইভাবে, লাইন ওবির জন্য -

tan β = (by - oy) / (bx - ox)   ...(eqn-3)

এখন, আমরা প্রয়োজন ϴ = β - α। ত্রিকোণমিতিতে আমাদের একটি সূত্র রয়েছে-

tan (β-α) = (tan β + tan α) / (1 - tan β * tan α)   ...(eqn-4)

একন -৪ এ (একন -২ থেকে tan α) এবং tan b(একন -৩ থেকে ) মূল্য প্রতিস্থাপন করার পরে এবং সরলীকরণ প্রয়োগের পরে আমরা-

tan (β-α) = ( (ax-ox)*(by-oy)+(ay-oy)*(bx-ox) ) / ( (ax-ox)*(bx-ox)-(ay-oy)*(by-oy) )

সুতরাং,

ϴ = β-α = tan^(-1) ( ((ax-ox)*(by-oy)+(ay-oy)*(bx-ox)) / ((ax-ox)*(bx-ox)-(ay-oy)*(by-oy)) )

হ্যাঁ, ওটাই!


এখন, নিম্নলিখিত চিত্রটি গ্রহণ করুন-

কোণ

এই সি # বা, জাভা পদ্ধতিটি কোণ ( ϴ ) গণনা করে -

    private double calculateAngle(double P1X, double P1Y, double P2X, double P2Y,
            double P3X, double P3Y){

        double numerator = P2Y*(P1X-P3X) + P1Y*(P3X-P2X) + P3Y*(P2X-P1X);
        double denominator = (P2X-P1X)*(P1X-P3X) + (P2Y-P1Y)*(P1Y-P3Y);
        double ratio = numerator/denominator;

        double angleRad = Math.Atan(ratio);
        double angleDeg = (angleRad*180)/Math.PI;

        if(angleDeg<0){
            angleDeg = 180+angleDeg;
        }

        return angleDeg;
    }

এই পদ্ধতিটি কীভাবে একটি সমবাহু ত্রিভুজ জন্য ব্যবহার করা যেতে পারে?
বিক্রান্ত

1
ঠিক আছে, আপনার উত্তর এখন ভাল কাজ করছে। সপ্তাহ আগে আমার কোডটিতে এটি কিছু যুক্তিযুক্ত সমস্যা ছিল।
বিক্রান্ত

6

অবজেক্টিভ-সিতে আপনি এটি দ্বারা এটি করতে পারেন

float xpoint = (((atan2((newPoint.x - oldPoint.x) , (newPoint.y - oldPoint.y)))*180)/M_PI);

বা এখানে আরও পড়ুন


7
আহ, না। তিনটি পয়েন্ট রয়েছে, কেন্দ্রটি (0,0) এ নেই এবং এটি একটি শীর্ষ ত্রিভুজের কোণ দেয়, শীর্ষের কোণ নয়। এবং একটি কোণের জন্য "এক্সপয়েন্ট" কী ধরণের নাম?
জিম বাল্টার

4

আপনি একটি স্বাক্ষরিত কোণ (-90) উল্লেখ করেছেন। অনেক অ্যাপ্লিকেশন এঙ্গনে চিহ্ন থাকতে পারে (ধনাত্মক এবং নেতিবাচক, দেখুন http://en.wikedia.org/wiki/Angle )। পয়েন্টগুলি যদি (বলুন) পি 2 (1,0), পি 1 (0,0), পি 3 (0,1) হয় তবে P3-P1-P2 কোণটি প্রচলিত ধনাত্মক (PI / 2) যেখানে কোণ P2-P1- পি 3 negativeণাত্মক। পক্ষগুলির দৈর্ঘ্য ব্যবহার করা + এবং - এর মধ্যে পার্থক্য করতে পারে না - সুতরাং এটির জন্য যদি আপনাকে ভেক্টর বা ম্যাথ.টান 2 (ক, খ) এর মতো কোনও ফাংশন ব্যবহার করতে হবে।

কোণগুলি 2 * পিআই ছাড়িয়েও প্রসারিত করতে পারে এবং এটি বর্তমান প্রশ্নের সাথে প্রাসঙ্গিক না হলেও আমি নিজের অ্যাঙ্গেল ক্লাসটি লিখেছি এটি যথেষ্ট গুরুত্বপূর্ণ ছিল (এটিও নিশ্চিত করার জন্য যে ডিগ্রি এবং রেডিয়েনগুলি মিশে না যায়)। কোণ 1 কোণ 2 এর চেয়ে কম কিনা তা প্রশ্নগুলি কীভাবে কোণকে সংজ্ঞায়িত করা হয় তার উপর সমালোচনা করে depends কোনও লাইন (-1,0) (0,0) (1,0) ম্যাথ.পিআই বা-ম্যাথ.পিআই হিসাবে উপস্থাপিত কিনা তাও সিদ্ধান্ত নেওয়া গুরুত্বপূর্ণ হতে পারে


4

আমার অ্যাঙ্গেল ডেমো প্রোগ্রাম

সম্প্রতি, আমারও একই সমস্যা ... ডেলফিতে এটি ওজেক্টিভ-সি এর সাথে খুব মিল।

procedure TForm1.FormPaint(Sender: TObject);
var ARect: TRect;
    AWidth, AHeight: Integer;
    ABasePoint: TPoint;
    AAngle: Extended;
begin
  FCenter := Point(Width div 2, Height div 2);
  AWidth := Width div 4;
  AHeight := Height div 4;
  ABasePoint := Point(FCenter.X+AWidth, FCenter.Y);
  ARect := Rect(Point(FCenter.X - AWidth, FCenter.Y - AHeight),
    Point(FCenter.X + AWidth, FCenter.Y + AHeight));
  AAngle := ArcTan2(ClickPoint.Y-Center.Y, ClickPoint.X-Center.X) * 180 / pi;
  AngleLabel.Caption := Format('Angle is %5.2f', [AAngle]);
  Canvas.Ellipse(ARect);
  Canvas.MoveTo(FCenter.X, FCenter.Y);
  Canvas.LineTo(FClickPoint.X, FClickPoint.Y);
  Canvas.MoveTo(FCenter.X, FCenter.Y);
  Canvas.LineTo(ABasePoint.X, ABasePoint.Y);
end;

2

একটি বৃত্তের বিন্দুর জন্য অনুভূমিক থেকে কোণ (0-360) এন্টিকলোকের দিকে ফিরে আসার জন্য একটি সি # পদ্ধতি রয়েছে।

    public static double GetAngle(Point centre, Point point1)
    {
        // Thanks to Dave Hill
        // Turn into a vector (from the origin)
        double x = point1.X - centre.X;
        double y = point1.Y - centre.Y;
        // Dot product u dot v = mag u * mag v * cos theta
        // Therefore theta = cos -1 ((u dot v) / (mag u * mag v))
        // Horizontal v = (1, 0)
        // therefore theta = cos -1 (u.x / mag u)
        // nb, there are 2 possible angles and if u.y is positive then angle is in first quadrant, negative then second quadrant
        double magnitude = Math.Sqrt(x * x + y * y);
        double angle = 0;
        if(magnitude > 0)
            angle = Math.Acos(x / magnitude);

        angle = angle * 180 / Math.PI;
        if (y < 0)
            angle = 360 - angle;

        return angle;
    }

চিয়ার্স, পল


2

function p(x, y) {return {x,y}}

function normaliseToInteriorAngle(angle) {
	if (angle < 0) {
		angle += (2*Math.PI)
	}
	if (angle > Math.PI) {
		angle = 2*Math.PI - angle
	}
	return angle
}

function angle(p1, center, p2) {
	const transformedP1 = p(p1.x - center.x, p1.y - center.y)
	const transformedP2 = p(p2.x - center.x, p2.y - center.y)

	const angleToP1 = Math.atan2(transformedP1.y, transformedP1.x)
	const angleToP2 = Math.atan2(transformedP2.y, transformedP2.x)

	return normaliseToInteriorAngle(angleToP2 - angleToP1)
}

function toDegrees(radians) {
	return 360 * radians / (2 * Math.PI)
}

console.log(toDegrees(angle(p(-10, 0), p(0, 0), p(0, -10))))


0

হাই স্কুল গণিত ব্যবহার করে এর জন্য একটি সহজ উত্তর আছে ..

ধরুন যে আপনার 3 পয়েন্ট রয়েছে

বিন্দু A থেকে B পর্যন্ত কোণ পেতে

angle = atan2(A.x - B.x, B.y - A.y)

পয়েন্ট বি থেকে সি পর্যন্ত কোণ পেতে To

angle2 = atan2(B.x - C.x, C.y - B.y)

Answer = 180 + angle2 - angle
If (answer < 0){
    return answer + 360
}else{
    return answer
}

আমি তৈরি করেছি সাম্প্রতিক প্রকল্পে আমি এই কোডটি ব্যবহার করেছি, খ কে পি 1 এ পরিবর্তন করুন .. আপনি চাইলে "180 +" মুছে ফেলতে পারেন


-1

ঠিক আছে, অন্যান্য উত্তরগুলি প্রয়োজনীয় সমস্ত কিছু কভার করে বলে মনে হচ্ছে, আপনি যদি JMonkeyEngine ব্যবহার করছেন তবে আমি কেবল এটি যুক্ত করতে চাই:

Vector3f.angleBetween(otherVector)

যে আমি এখানে এসেছি খুঁজছেন :)


-2
      Atan2        output in degrees
       PI/2              +90
         |                | 
         |                |    
   PI ---.--- 0   +180 ---.--- 0       
         |                |
         |                |
       -PI/2             +270

public static double CalculateAngleFromHorizontal(double startX, double startY, double endX, double endY)
{
    var atan = Math.Atan2(endY - startY, endX - startX); // Angle in radians
    var angleDegrees = atan * (180 / Math.PI);  // Angle in degrees (can be +/-)
    if (angleDegrees < 0.0)
    {
        angleDegrees = 360.0 + angleDegrees;
    }
    return angleDegrees;
}

// Angle from point2 to point 3 counter clockwise
public static double CalculateAngle0To360(double centerX, double centerY, double x2, double y2, double x3, double y3)
{
    var angle2 = CalculateAngleFromHorizontal(centerX, centerY, x2, y2);
    var angle3 = CalculateAngleFromHorizontal(centerX, centerY, x3, y3);
    return (360.0 + angle3 - angle2)%360;
}

// Smaller angle from point2 to point 3
public static double CalculateAngle0To180(double centerX, double centerY, double x2, double y2, double x3, double y3)
{
    var angle = CalculateAngle0To360(centerX, centerY, x2, y2, x3, y3);
    if (angle > 180.0)
    {
        angle = 360 - angle;
    }
    return angle;
}

}

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