দেওয়া পয়েন্ট (x,y) এবং লেন্থ/ব্রেডথ রেশিও l:b। এই রেশিও মেনে একটি রেক্ট্যাঙ্গল খুঁজতে হবে যেটি পয়েন্টটি কভার করে। একাধিক হলে সেটি বেছে নিতে হবে যেটির সেন্টার পয়েন্টটির সবচোয় নিকট।
অ্যালগরিদম
- রেশিও
l/bসরল করুন (GCD দিয়ে ভাগ করুন)। k = min(n/l, m/b)বের করুন (বাউন্ডারিn×mএর মধ্যে রাখতে)।- পয়েন্টকে সেন্টার ধরে রেক্ট্যাঙ্গল বানান।
- বাউন্ডারি বাইরে চলে গেলে এডজাস্ট করুন।
C++ কোড উদাহরণ
#include <cmath>
#include <iostream>
using namespace std;
int gcd(int a, int b) { return a==0 ? b : gcd(b%a, a); }
void calc_coords(int n, int m, int x, int y, int l, int b) {
int g = gcd(l, b); l /= g; b /= g;
int k = min(n/l, m/b);
int x1 = x - (k*l - k*l/2);
int x2 = x + k*l/2;
int y1 = y - (k*b - k*b/2);
int y2 = y + k*b/2;
if (x1 < 0) { x2 -= x1; x1 = 0; }
if (x2 > n) { x1 -= x2-n; x2 = n; }
if (y1 < 0) { y2 -= y1; y1 = 0; }
if (y2 > m) { y1 -= y2-m; y2 = m; }
cout << "Coordinates: " << x1 << " " << y1 << " " << x2 << " " << y2 << endl;
}
int main() {
calc_coords(50, 20, 10, 6, 4, 7);
return 0;
}
আউটপুট
Coordinates: 6 0 14 14