2008-12-05 22 views
65

मैं सी और डी के बीच जाने के लिए ए और बी के बीच संख्याओं को रैखिक रूप से कैसे मैप कर सकता हूं।मठ - मानचित्रण संख्या

यही है, मुझे 2 और 6 के बीच की संख्या 10 से 20 के बीच की संख्या में मैप करना है ... लेकिन मुझे सामान्यीकृत मामले की आवश्यकता है।

मेरा दिमाग तला हुआ है।

+3

दो-बिंदु फॉर्म। http://en.wikipedia.org/wiki/Linear_equation#Two-point_form – kennytm

उत्तर

16

दो श्रेणियों के आकार के बीच अनुपात प्राप्त करने के लिए विभाजित करें, फिर अपनी आंतरिक श्रेणी के प्रारंभिक मूल्य को घटाएं, अनुपात से गुणा करें और अपनी दूसरी श्रेणी के प्रारंभिक मूल्य को जोड़ें। दूसरे शब्दों में,

R = (20 - 10)/(6 - 2) 
y = (x - 2) * R + 10 

यह समान रूप से दूसरी श्रेणी में पहली श्रेणी से संख्याओं को फैलाता है।

+0

यह काम नहीं करता है। मेरी रेंज 1000000000 से 99 99 99 99 99 है और संख्या 1 99 99 99 999 से हो सकती है। – Dejell

+0

@ ओदेलीया बेशक यह काम करता है। यह एक साधारण पर्याप्त गणितीय परिवर्तन है। आपको बस एक बड़ी पर्याप्त संख्या प्रकार (बिग्नम या इसी तरह) का उपयोग करने की आवश्यकता है। 32 बिट पूर्णांक के लिए आपकी संख्याएं बहुत बड़ी हैं - लेकिन उदाहरण के लिए 64 बिट पूर्णांक काम करेंगे। –

+0

वे दो प्रकार के हैं। डबल आर = (20 - 10)/(6 - 2); \t \t डबल वाई = (एक्स -2) * आर +10; – Dejell

137

अपना नंबर एक्स ए और बी के बीच गिर जाता है, और आप वाई सी और डी के बीच गिर चाहते हैं, तो आपको निम्न रैखिक आवेदन कर सकते हैं परिणत:

वाई = (XA)/(बीए) * (डीसी) + सी

आपको जो चाहिए वह आपको देना चाहिए, हालांकि आपका प्रश्न थोड़ा संदिग्ध है, क्योंकि आप विपरीत दिशा में अंतराल को भी मैप कर सकते हैं। शून्य से विभाजन के लिए बस देखें और आपको ठीक होना चाहिए।

+0

धन्यवाद। ठीक वही जो मेरे द्वारा खोजा जा रहा था। – Sam

+31

फिर इसके बाद के निशान पर क्लिक करके इस उत्तर को "स्वीकृत" के रूप में चिह्नित करें। –

+0

धन्यवाद पीटर, आप शानदार हैं! – Adi

1

पहली श्रेणी में प्रत्येक इकाई अंतराल दूसरी सीमा पर (डी-सी)/(बी-ए) "स्पेस" लेता है।

छद्म:

var interval = (d-c)/(b-a) 
for n = 0 to (b - a) 
    print c + n*interval 

कैसे आप राउंडिंग संभाल आप पर निर्भर है।

1
int srcMin = 2, srcMax = 6; 
int tgtMin = 10, tgtMax = 20; 

int nb = srcMax - srcMin; 
int range = tgtMax - tgtMin; 
float rate = (float) range/(float) nb; 

println(srcMin + " > " + tgtMin); 
float stepF = tgtMin; 
for (int i = 1; i < nb; i++) 
{ 
    stepF += rate; 
    println((srcMin + i) + " > " + (int) (stepF + 0.5) + " (" + stepF + ")"); 
} 
println(srcMax + " > " + tgtMax); 

शून्य से विभाजित होने पर चेक के साथ, निश्चित रूप से।

2

एक तरफ के रूप में, क्लासिक कन्वर्ट सेल्सियस फारेनहाइट के समान समस्या है जहां आप 0 - 100 (सी) से 32 - 212 (एफ) के बराबर संख्या को मैप करना चाहते हैं।

+0

यह एक जवाब कैसे है? – shinzou

+0

यह प्रश्न के आवेदन का एक उदाहरण है। कई लोगों को प्रारंभिक सीएस कक्षाओं में यह सरल समस्या है और यह नहीं मानते कि समाधान को अन्य समस्याओं के लिए सामान्यीकृत किया जा सकता है। मैं मूल प्रश्न में संदर्भ जोड़ने की कोशिश कर रहा था। मूल प्रश्न का पहले से ही पर्याप्त उत्तर दिया गया था। – Metro

0

@PeterAllenWebb जवाब है, के अलावा अगर आप परिणाम निम्न का उपयोग कर वापस उल्टा करने के लिए करना चाहते हैं:

reverseX = (B-A)*(Y-C)/(D-C) + A 
1

यह java.lang.Math कक्षा में इस कार्यक्षमता के लिए अच्छा होगा के रूप में इस तरह के एक व्यापक रूप से है आवश्यक कार्य और अन्य भाषाओं में उपलब्ध है।

final static double EPSILON = 1e-12; 

public static double map(double valueCoord1, 
     double startCoord1, double endCoord1, 
     double startCoord2, double endCoord2) { 

    if (Math.abs(endCoord1 - startCoord1) < EPSILON) { 
     throw new ArithmeticException("/ 0"); 
    } 

    double offset = startCoord2; 
    double ratio = (endCoord2 - startCoord2)/(endCoord1 - startCoord1); 
    return ratio * (valueCoord1 - startCoord1) + offset; 
} 

मैं यहाँ इस कोड डाल रहा हूँ भविष्य के लिए एक संदर्भ के रूप में अपने आप को और यह किसी को मदद मिलेगी हो सकता है: यहाँ एक सरल कार्यान्वयन है।

संबंधित मुद्दे