স্বল্প শক্তিযুক্ত হার্ডওয়্যার উপর বিজ্ঞপ্তি গতি


10

আমি পুরানো 2D গেমগুলিতে প্ল্যাটফর্ম এবং শত্রুদের চেনাশোনাগুলিতে সরানো সম্পর্কে ভাবছিলাম এবং আমি কীভাবে এটি হয়ে গেল তা ভাবছিলাম। আমি প্যারাম্যাট্রিক সমীকরণগুলি বুঝতে পারি, এবং এটি করার জন্য পাপ এবং কোস ব্যবহার করা তুচ্ছ, তবে কোনও এনইএস বা এসএনইএস রিয়েল টাইম ট্রিগ কল করতে পারে? আমি ভারী অজ্ঞতা স্বীকার করি তবে আমি ভেবেছিলাম সেগুলি ব্যয়বহুল অপারেশন। আরও সস্তায় সেই গতি গণনা করার কোনও চতুর উপায় আছে কি?

আমি ট্রিগমের অঙ্কের পরিচয়গুলি থেকে একটি অ্যালগরিদম অর্জনের জন্য কাজ করছি যা কেবল প্রাক্কলকুলেটেড ট্রিগ ব্যবহার করবে তবে এটি বিশৃঙ্খল বলে মনে হচ্ছে।


1
আমাকে বেশ কয়েক বছর আগে একটি কাজের সাক্ষাত্কারের সময় এই প্রশ্নটি করা হয়েছিল।
ক্রশ ওয়ার্কস

উত্তর:


14

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

এই কৌশলটির সম্ভাব্য সমস্যাটি হ'ল এটি মেমরির জায়গাটি গ্রাস করে, যদিও আপনি আপনার টেবিলের ডেটা কম রেজোলিউশনের জন্য স্থির করে বা কম ডেটা সঞ্চয় করার জন্য কিছু ফাংশনগুলির পর্যায়ক্রমিক প্রকৃতির সুযোগ নিয়ে এবং রানটাইমের সময় এটি মিরর করে can

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


2
সত্য গল্প. LUT এবং একটি চেনাশোনা 256 ডিগ্রি উত্পাদন সস্তা ট্রিগ হিসাবে সংজ্ঞায়িত করা হয়েছে, মেমরিটি কেবল তখনই করা হত যদি মেমরিটি শক্ত ছিল এবং কয়েকটি বাইট অর্জনের শেষ উপায় হিসাবে as ব্রেনহ্যামের রেফারেন্সও বিভিন্ন আন্দোলনের জন্য স্পষ্ট on
প্যাট্রিক হিউজেস

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

3
@ ক্র্যাশ ওয়ার্কস: এটি কোনও টেইলর সিরিজের কোনও উপায় নেই, এটি সত্যিই বোকামি হবে। এটি সম্ভবত একটি মিনিম্যাক্স বহুপদী। প্রকৃতপক্ষে, পাপ () এর যাবতীয় আধুনিক প্রয়োগগুলি আমি দেখেছি মিনিম্যাক্স বহুত্বের উপর ভিত্তি করে।
সাম হোশেভার

@ সামোহেশ্বর হতে পারে আমি সবেমাত্র কুড়াল + বিএক্স ^ 3 + সিএক্স ^ 5 + এর যোগফল দেখেছি এবং ধরে নিয়েছি "টেলর সিরিজ"।
ক্র্যাশওয়ার্কস

9

সেখানে একটি পরিবর্তন এর Bresenham এর এলগরিদম দ্বারা জেমস Frith যা আরও দ্রুত হওয়া উচিত যেহেতু এটি সম্পূর্ণরূপে গুণ ঘটিয়েছে। এটি অর্জনের জন্য এটির জন্য কোনও অনুসন্ধানের টেবিলের প্রয়োজন হবে না, যদিও ব্যাসার্ধ স্থির থাকে যদি কেউ টেবিলে ফলাফল সঞ্চয় করতে পারে। যেহেতু ব্রেইনহ্যাম এবং ফ্রিথের অ্যালগরিদম উভয়ই 8-ভাঁজ প্রতিসাম্য ব্যবহার করে, তাই এই সন্ধানের টেবিলটি তুলনামূলকভাবে ছোট হবে।

// FCircle.c - Draws a circle using Frith's algorithm.
// Copyright (c) 1996  James E. Frith - All Rights Reserved.
// Email:  jfrith@compumedia.com

typedef unsigned char   uchar;
typedef unsigned int    uint;

extern void SetPixel(uint x, uint y, uchar color);

// FCircle --------------------------------------------
// Draws a circle using Frith's Algorithm.

void FCircle(int x, int y, int radius, uchar color)
{
  int balance, xoff, yoff;

  xoff = 0;
  yoff = radius;
  balance = -radius;

  do {
    SetPixel(x+xoff, y+yoff, color);
    SetPixel(x-xoff, y+yoff, color);
    SetPixel(x-xoff, y-yoff, color);
    SetPixel(x+xoff, y-yoff, color);
    SetPixel(x+yoff, y+xoff, color);
    SetPixel(x-yoff, y+xoff, color);
    SetPixel(x-yoff, y-xoff, color);
    SetPixel(x+yoff, y-xoff, color);

    balance += xoff++;
    if ((balance += xoff) >= 0)
        balance -= --yoff * 2;

  } while (xoff <= yoff);
} // FCircle //

যদি আপনি অদ্ভুত ফলাফল পেয়ে থাকেন তবে এর কারণ আপনি অনির্ধারিত (বা কমপক্ষে অনির্দিষ্ট) আচরণের দিকে আহ্বান করছেন । "ক () + বি ()" মূল্যায়ন করার সময় কোন কলটি প্রথমে মূল্যায়ন করা হয় তা সি ++ নির্দিষ্ট করে না এবং আরও সংশোধনকারী সংহতগুলি কল করে। এই সমস্যা এড়ানোর জন্য, একই অভিব্যক্তি আপনি যেমন পড়া একটি পরিবর্তনশীল পরিবর্তন করবেন না xoff++ + xoffএবং --yoff + yoff। আপনার চেঞ্জলিস্ট এটিকে ঠিক করে দেবে, দ্রষ্টব্য নোটের পরিবর্তে স্থানে স্থির করার বিষয়টি বিবেচনা করুন। (উদাহরণস্বরূপ সি ++ স্ট্যান্ডার্ডের 5 অনুচ্ছেদ 4 এবং স্ট্যান্ডার্ডিজ যা স্পষ্টভাবে এটিকে কল করে দেখুন দেখুন)
মোলিংমোনকি

@MaulingMonkey: আপনি এর সমস্যাযুক্ত মূল্যায়ন অর্ডার চলেছেন অধিকার balance += xoff++ + xoffএবং balance -= --yoff + yoff। আমি এটিকে অপরিবর্তিত রেখেছি, কারণ ফ্রিথের অ্যালগরিদমটি মূলত এইভাবে লেখা হয়েছিল, পরে ফিক্সটি নিজেই যোগ করেছিলেন ( এখানে দেখুন )। এখনই স্থির।
নবীভি

2

আপনি টেলর এক্সপেনশনগুলি http://en.wikedia.org/wiki/Taylor_series ব্যবহার করে ট্রিগ ফাংশনগুলির একটি আনুমানিক সংস্করণ ব্যবহার করতে পারেন

উদাহরণস্বরূপ, প্রথম চারটি টেলর সিরিজের শর্তাদি ব্যবহার করে আপনার সাইনটির যুক্তিসঙ্গত পরিমাণ থাকতে পারে

জ্যা


এটি সাধারনত সত্য, তবে এতগুলি সতর্কতার সাথে আসে যা আমি বলতে চাই যে আপনি নিজের পাপ () কোডটি ভার্চুয়াল কখনও লিখবেন না যতক্ষণ না আপনি যা করছেন তার সাথে খুব পরিচিত। বিশেষত, তালিকাভুক্তের তুলনায় আরও কিছু (আরও প্রান্তিক) উন্নত বহুবচন রয়েছে, এমনকি আরও ভাল যুক্তিযুক্ত আনুষঙ্গিকতা এবং আপনার সূত্রটি কোথায় প্রয়োগ করতে হবে এবং আপনার যুক্তিটিকে একটি পরিসীমাতে সংকীর্ণ করার জন্য পাপ এবং মহাকাশের সময়কাল কীভাবে ব্যবহার করতে হবে তা বুঝতে হবে the সিরিজ প্রযোজ্য। এটি সেই ক্ষেত্রে একটি যেখানে পুরনো অ্যাফোরিজম 'একটি সামান্য জ্ঞান একটি বিপজ্জনক জিনিস' সত্য সত্য।
স্টিভেন স্টাডনিকি

আপনি কি কিছু রেফারেন্স দিতে পারেন যাতে আমি এই বহুপদী বা অন্যান্য আরও ভাল অনুমান শিখতে পারি? আমি সত্যিই এটি শিখতে চাই এই সিরিজ জিনিসটি ছিল আমার ক্যালকুলাস কোর্সের সবচেয়ে মন খারাপের অংশ।

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

@ ভ্যান্ডেল: আপনি যদি মিনিম্যাক্স বহুভুজ তৈরি করতে চান তবে আমি ললিমেজ সম্পর্কে আপনার ধারণা শুনে খুশি হব
সাম হোচেভার

টেলর সিরিজ কোনও বিরতিতে নয়, একক পয়েন্টের চারপাশে কোনও ফাংশনের আচরণের সমান করে। বহুবৃত্তটি পাপ (0) বা এর সপ্তম ডেরাইভেটিভ x = 0 এর কাছাকাছি মূল্যায়নের জন্য দুর্দান্ত তবে x = pi / 2 এ ত্রুটি, এর পরে আপনি কেবল আয়না এবং পুনরাবৃত্তি করতে পারেন, এটি বেশ বড়। পরিবর্তে x = pi / 4 এর চারপাশে টেলর সিরিজটি মূল্যায়ন করে আপনি পঞ্চাশ গুণ ভাল করতে পারবেন তবে আপনি যা চান তা হ'ল একটি বহুবচন যা ব্যবধানে সর্বাধিক ত্রুটিটি একক পয়েন্টের নিকটে নির্ভুলতার ব্যয়কে হ্রাস করে।
টমাস

2

একটি বৃত্তের উপর অভিন্ন ভ্রমণ করার জন্য একটি দুর্দান্ত এক অ্যালগরিদম হ'ল গের্তজেল অ্যালগরিদম । এটিতে প্রতি পদে মাত্র 2 গুণ এবং 2 সংযোজন, কোনও অনুসন্ধানের টেবিল এবং খুব ন্যূনতম রাজ্য (4 সংখ্যা) প্রয়োজন।

প্রথমে প্রয়োজনীয় ধাপের আকারের উপর ভিত্তি করে কিছু স্থিরকগুলি, সম্ভবত হার্ডকোডযুক্ত সংজ্ঞা দিন (এই ক্ষেত্রে, 2π / 64):

float const step = 2.f * M_PI / 64;
float const s = sin(step);
float const c = cos(step);
float const m = 2.f * c;

অ্যালগরিদম 4 টি সংখ্যাটিকে তার রাজ্য হিসাবে ব্যবহার করে, এটি সূচনা করে:

float t[4] = { s, c, 2.f * s * c, 1.f - 2.f * s * s };

এবং অবশেষে প্রধান লুপ:

for (int i = 0; ; i++)
{
    float x = m * t[2] - t[0];
    float y = m * t[3] - t[1];
    t[0] = t[2]; t[1] = t[3]; t[2] = x; t[3] = y;
    printf("%f %f\n", x, y);
}

এটি চিরতরে যেতে পারে। এখানে প্রথম 50 টি পয়েন্ট রয়েছে:

গয়ার্তজেল অ্যালগরিদম

অ্যালগরিদম অবশ্যই নির্দিষ্ট পয়েন্ট হার্ডওয়্যার উপর কাজ করতে পারে। ব্রেসেনহ্যামের বিপক্ষে স্পষ্ট জয় বৃত্তের উপর অবিচ্ছিন্ন গতি।

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