কোণার অবস্থান / ঘোরানো / কাত করা আয়তক্ষেত্রের চিহ্নগুলি কীভাবে গণনা করব?


17

আমি দুটি উপাদান পেয়েছি, একটি 2 ডি পয়েন্ট এবং একটি আয়তক্ষেত্রাকার অঞ্চল। বিন্দুটি সেই অঞ্চলের মাঝখানে প্রতিনিধিত্ব করে। আমি সেই জায়গার প্রস্থ এবং উচ্চতাও জানি। এবং অঞ্চলটি গ্রিডের তুলনায় 40 ° দ্বারা কাত হয়ে থাকে।

এখন আমি কেবল এই ডেটা ব্যবহার করে সেই ঝুঁকির জায়গার প্রতিটি কোণার নিখুঁত অবস্থানগুলি গণনা করতে চাই। এটা কি সম্ভব?

উত্তর:


30
X = x*cos(θ) - y*sin(θ)
Y = x*sin(θ) + y*cos(θ)

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

// cx, cy - center of square coordinates
// x, y - coordinates of a corner point of the square
// theta is the angle of rotation

// translate point to origin
float tempX = x - cx;
float tempY = y - cy;

// now apply rotation
float rotatedX = tempX*cos(theta) - tempY*sin(theta);
float rotatedY = tempX*sin(theta) + tempY*cos(theta);

// translate back
x = rotatedX + cx;
y = rotatedY + cy;

এটি 4 টি কোণে প্রয়োগ করুন এবং আপনার কাজ শেষ হয়েছে!


4

পাইভট সম্পর্কে মূল বিন্দুটি স্থানাঙ্কিত সিস্টেমে অনুবাদ করে যেখানে পিভটটি উত্স, তারপরে এই উত্সটি ঘোরানো এবং তারপরে বিশ্বের স্থানাঙ্কগুলিতে অনুবাদ করে এটি একটি সাধারণ কৌশল। (এই পদ্ধতির খুব ভাল ব্যাখ্যা খান একাডেমীতে পাওয়া যায় )

তবে আপনি বিশ্ব সমন্বয়গুলিতে আপনার আয়তক্ষেত্রের কোণগুলি সংরক্ষণ করছেন না যাতে আমরা আপনার কাছে যে ডেটা উপলব্ধ রয়েছে তার সাথে মানিয়ে নিতে একটি দৃষ্টিভঙ্গি তৈরি করতে পারি।

Cx, Cy // the coordinates of your center point in world coordinates
W      // the width of your rectangle
H      // the height of your rectangle
θ      // the angle you wish to rotate

//The offset of a corner in local coordinates (i.e. relative to the pivot point)
//(which corner will depend on the coordinate reference system used in your environment)
Ox = W / 2
Oy = H / 2

//The rotated position of this corner in world coordinates    
Rx = Cx + (Ox  * cos(θ)) - (Oy * sin(θ))
Ry = Cy + (Ox  * sin(θ)) + (Oy * cos(θ))

এই পদ্ধতির পরে সহজেই অন্য তিনটি কোণে প্রয়োগ করা যেতে পারে।


2

অন্যান্য উত্তরের উপর ভিত্তি করে, এবং তাদের পরিপূরক করতে, আমি এখানে P5 দিয়ে একটি উদাহরণ তৈরি করতে পরিচালিত করেছি ।

আপনি এখানে সরাসরি অ্যাক্সেস করতে চাইলে কোডটি এখানে:

function setup() {
createCanvas(400, 400);
}

var count = 0;

function draw() {
  background(250);
  rectMode(CENTER);
  stroke(0,0,255);
  fill(0,0,255);
  count += 1;

  var box1X = 100;
  var box1Y = 100;
  var box2X = 160;
  var box2Y = 100;
  var box1R = count;
  var box2R = -60-count;
  var box1W = 50;
  var box1H = 50;
  var box2W = 50;
  var box2H = 50;

  translate(box1X, box1Y);
  rotate(radians(box1R));
  rect(0, 0, box1W, box1H);
  rotate(radians(-box1R));
  translate(-box1X, -box1Y);

  translate(box2X, box2Y);
  rotate(radians(box2R));
  rect(0, 0, box2W, box2H);
  rotate(radians(-box2R));
  translate(-box2X, -box2Y);

  stroke(255,0,0);
  fill(255,0,0);

  var pointRotated = [];
  pointRotated.push(GetPointRotated(box1X, box1Y, box1R, -box1W/2, box1H/2));  // Dot1
  pointRotated.push(GetPointRotated(box1X, box1Y, box1R, box1W/2, box1H/2));   // Dot2
  pointRotated.push(GetPointRotated(box1X, box1Y, box1R, -box1W/2, -box1H/2)); // Dot3
  pointRotated.push(GetPointRotated(box1X, box1Y, box1R, box1W/2, -box1H/2));  // Dot4
  pointRotated.push(createVector(box1X, box1Y)); // Dot5

  for (var i=0;i<pointRotated.length;i++){
ellipse(pointRotated[i].x,pointRotated[i].y,3,3);
  }
}

function GetPointRotated(X, Y, R, Xos, Yos){
// Xos, Yos // the coordinates of your center point of rect
// R      // the angle you wish to rotate

//The rotated position of this corner in world coordinates    
var rotatedX = X + (Xos  * cos(radians(R))) - (Yos * sin(radians(R)))
var rotatedY = Y + (Xos  * sin(radians(R))) + (Yos * cos(radians(R)))

return createVector(rotatedX, rotatedY)
}
<script src="//cdnjs.cloudflare.com/ajax/libs/p5.js/0.3.3/p5.min.js"></script>


1

উপরের কোডটির রিফ্যাকচারিং একটি পরিষ্কার আপ ফর্ম দেয় যা প্রতিটি কোণার জন্য মূলত center + height/2 + width/2প্রতিটি কোণার জন্য উপযুক্ত হিসাবে চিহ্ন সহ সাধারণ সত্যটিও হাইলাইট করে । আপনি চিকিত্সা করা height/2এবং width/2ঘোরানো ভেক্টর হিসাবে এটিও ধারণ করে ।

সাহায্যকারীদের ইনলাইন করার জন্য দোভাষীকে বিশ্বাস করা, এটি বেশ কার্যকর হওয়া উচিত, আমাদের যদি এটি বেঞ্চমার্ক করার চেষ্টা করা উচিত।

function addPoints(p1, p2) {
    return { x: p1.x + p2.x, y: p1.y + p2.y }
}

function subPoints(p1, p2 ) {
    return { x: p1.x - p2.x, y: p1.y - p2.y }
}

function multPoints(p1, p2 ) {
    return { x: p1.x * p2.x, y: p1.y * p2.y }
}

function getRulerCorners() {
    const sin = Math.sin(ruler.angle);
    const cos = Math.cos(ruler.angle);
    const height = { x: sin * ruler.height/2, y: cos * ruler.height/2 };
    const heightUp = addPoints(ruler, multPoints({x: 1, y :-1}, height));
    const heightDown = addPoints(ruler, multPoints({x: -1, y: 1}, height));
    const width = { x: cos * ruler.width/2, y: sin * ruler.width/2 };
    ruler.nw = subPoints(heightUp, width);
    ruler.ne = addPoints(heightUp, width );
    ruler.sw = subPoints(heightDown, width);
    ruler.se = addPoints(heightDown, width);
}

0

ঘূর্ণন সম্পর্কিত উইকিপিডিয়া নিবন্ধটি দেখুন । সারমর্মটি হ'ল:

(1) c যদি কেন্দ্র বিন্দু হয় তবে কোণগুলি সি + ( এল / 2, ডাব্লু / 2), +/- ইত্যাদি হয়, যেখানে এল এবং ডাব্লু আয়তক্ষেত্রের দৈর্ঘ্য এবং প্রস্থ হয়।

(2) আয়তক্ষেত্র অনুবাদ যাতে কেন্দ্র , উৎপত্তি হয় যতবার চারটি কোণে থেকে।

(3) উদ্ধৃত ত্রি সূত্রের মাধ্যমে 40 ডিগ্রি দ্বারা আয়তক্ষেত্রটি ঘোরান।

(4) প্রতিটি সমন্বয় সি যুক্ত করে ফিরে অনুবাদ করুন ।


আপনার উত্তরের জন্য ধন্যবাদ তবে আমি ভয় করি যে আমি এটিটি পেলাম না। কীভাবে কোণগুলি (অজানা) থেকে অজানা থাকলে আমি কেন্দ্রটি (পরিচিত) বিয়োগ করব? মানে, কোণগুলির স্থানাঙ্কগুলি হ'ল আমি যা জানার চেষ্টা করছি।
স্ট্যাকি

আমি স্পষ্ট করার চেষ্টা করেছি।
জোসেফ ও'রউর্ক 15

0

সম্ভবত, সমস্যাটিকে দুটি ভাগে ভাগ করে কিছু অপ্টিমাইজেশন উপলব্ধ রয়েছে:

  • উপরের এবং নীচের দিকের কেন্দ্রটি যেমন, কেন্দ্র + ঘোরানো উচ্চতা / 2 গণনা করুন।
  • ঘোরানো প্রস্থ / 2 ব্যবহার করে এই কেন্দ্রের পয়েন্টগুলির সাথে সম্পর্কিত কোণগুলি গণনা করুন
  • আসল সাইন এবং কোসাইন একবার এবং সকলের জন্য গণনা করুন।

নীচে কোড, এখানে আয়তক্ষেত্রকে শাসক বলা হয়। নিয়ম। x, শাসক, y আয়তক্ষেত্রের কেন্দ্র।

/** Middle point on rulers's top side. */
function getRulerTopMiddle(cos, sin) {
    return {
        x : ruler.x + sin * ruler.height/2,
        y : ruler.y - cos * ruler.height/2
    }
 }

/** Middle point on rulers's bottom side. */
function getRulerBottomMiddle(cos, sin) {
    return {
        x : ruler.x - sin * ruler.height/2,
        y : ruler.y + cos * ruler.height/2
    }
 }

/** Update ruler's four corner coordinates. */
function getRulerCorners() {
    const sin = Math.sin(ruler.angle);
    const cos = Math.cos(ruler.angle);
    const topMiddle = getRulerTopMiddle(cos, sin);
    const bottomMiddle = getRulerBottomMiddle(cos, sin);

    ruler.nw = {
        x: topMiddle.x - (cos * ruler.width/2),
        y: topMiddle.y - (sin * ruler.width/2)
    }   
    ruler.ne = {
        x: topMiddle.x + (cos * ruler.width/2),
        y: topMiddle.y + (sin * ruler.width/2)
    }   
    ruler.sw = {
        x: bottomMiddle.x - (cos * ruler.width/2),
        y: bottomMiddle.y - (sin * ruler.width/2)
    }   
    ruler.se = {
        x: bottomMiddle.x + (cos * ruler.width/2),
        y: bottomMiddle.y + (sin * ruler.width/2)
    }
}

0

একটু দেরি হলেও এখানে আমি ব্যবহার করেছি এমন একটি কমপ্যাক্ট ফাংশন। এটি শীর্ষ এবং বাম পয়েন্টগুলি গণনা করে, তারপরে কেবল বিপরীত কোণগুলির জন্য এগুলি ফ্লিপ করে।

rotatedRect(float x, float y, float halfWidth, float halfHeight, float angle)
{
    float c = cos(angle);
    float s = sin(angle);
    float r1x = -halfWidth * c - halfHeight * s;
    float r1y = -halfWidth * s + halfHeight * c;
    float r2x =  halfWidth * c - halfHeight * s;
    float r2y =  halfWidth * s + halfHeight * c;

    // Returns four points in clockwise order starting from the top left.
    return
        (x + r1x, y + r1y),
        (x + r2x, y + r2y),
        (x - r1x, y - r1y),
        (x - r2x, y - r2y);
}

0

পুরানো পোস্ট, তবে এখানে এটি করার অন্য একটি উপায়:

public static Point[] GetRotatedCorners(Rectangle rectangleToRotate, float angle)
{

    // Calculate the center of rectangle.
    Point center = new Point(rectangleToRotate.Left + (rectangleToRotate.Left + rectangleToRotate.Right) / 2, rectangleToRotate.Top + (rectangleToRotate.Top + rectangleToRotate.Bottom) / 2);

    Matrix m = new Matrix();
    // Rotate the center.
    m.RotateAt(360.0f - angle, center);

    // Create an array with rectangle's corners, starting with top-left corner and going clock-wise.
    Point[] corners = new Point[]
        {
            new Point(rectangleToRotate.Left, rectangleToRotate.Top), // Top-left corner.
            new Point(rectangleToRotate.Right, rectangleToRotate.Top),    // Top-right corner.
            new Point(rectangleToRotate.Right, rectangleToRotate.Bottom), // Bottom-right corner.
            new Point(rectangleToRotate.Left, rectangleToRotate.Bottom),  // Botton-left corner
        };

    // Now apply the matrix to every corner of the rectangle.
    m.TransformPoints(corners);

    // Return the corners of rectangle rotated by the provided angle.
    return corners;
}

আশা করি এটা সাহায্য করবে!

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