2010-12-02 14 views
18

मैं कैनवास में एक ग्राफ खींच रहा हूं और इस तथ्य से संघर्ष कर रहा हूं कि वाई-अक्ष "पिछड़ा" है। मूल शीर्ष बाएं कोने में है, और बढ़ते मूल्यों की बजाय नीचे जाना है।एचटीएमएल 5 कैनवास में, क्या मैं वाई अक्ष को नीचे की बजाय ऊपर कर सकता हूं?

(0,0)   (x,0)  (0,y)^
     +-------------->    | 
     |       | 
     | CANVAS     |  INSTEAD 
     | DOES THIS    |  OF THIS 
     |       | 
     |       +-----------------> 
(0,y) v      (0,0)    (x,0) 

मुझे पता है कि मैं अनुवाद() का उपयोग करके मूल को नीचे-बाएं कोने में ले जा सकता हूं।

context.translate(0, canvas.height); 

और मुझे पता है कि मैं स्केल() का उपयोग करके वाई-अक्ष को उलटा कर सकता हूं।

context.scale(1, -1); 

ऐसा लगता है कि यह टेक्स्ट को ऊपर-नीचे दिखाई देता है। क्या कैनवास के निर्देशांक मुझे जिस तरह से उम्मीद करते हैं, काम करने का कोई तरीका है?

उत्तर

10

अधिक आधुनिक सेटअप के लिए, आप context.transform(1, 0, 0, -1, 0, canvas.height) उपयोग कर सकते हैं। यह वाई धुरी flips और पूरे कैनवास एक स्क्रीनफुल चालित करता है।

अधिक उपलब्ध परिवर्तनों पर: https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/transform

+0

बस एक वी नोट के रूप में - यदि आप किसी माउस तर्क को संभालने में हैं तो आपको माउस ईवेंट के लिए पॉइंटर स्थिति को भी घुमाने की आवश्यकता होगी। –

+0

टॉम, आप माउस घटनाओं के लिए सूचक स्थिति कैसे उलटा करते हैं? –

10

मुझे लगता है कि आप इसका उपयोग करने के लिए बहुत बेहतर करेंगे। अधिकांश पिक्सेल-आधारित वीडियो/स्क्रीन एपीआई के साथ मूल शीर्ष बाईं ओर है।

Here's a discussion on the subject

+1

हालांकि यह बाउंडिंग बॉक्स के लिए जहां 'तल> top' बहुत भ्रामक है। –

+2

यह वास्तव में भ्रमित नहीं है, जब आप इसके बारे में कुछ मिनट के लिए सोचते हैं। यह वास्तव में स्वीकार किए गए ज्ञान से बहुत कम मनमाना है कि दाएं> बाएं (जो कई मानव भाषाओं में सत्य नहीं है)। प्रतिमान यह है कि शीर्ष बाएं कोने ज्ञात है, और सभी मूल्य उस से बाहर निकलते हैं। यह तार्किक है क्योंकि यह एकमात्र चीज है जिसे हम वास्तव में गिनती कर सकते हैं जब मनमाने ढंग से आकार वाली स्क्रीन या दस्तावेज़ के अंदर कुछ प्रस्तुत होता है। – joshstrike

+2

मुझे लगता है कि * दस्तावेज़ * यहां कुंजी शब्द है। स्क्रीन किसी भी तरह से जा सकती है, इस पर निर्भर करता है कि क्या उन्हें टेक्स्ट या कार्टेशियन ग्राफ प्रदर्शित करने के लिए उपयोग किया जाता है; लेकिन हमारे पास अक्सर * ऊपरी * कोने में मूल होने का कारण यह है कि ** दस्तावेज़ ** लगभग सभी मानव भाषाओं में नीचे-नीचे-नीचे, नीचे-नीचे नहीं जाते हैं (नीचे से दुर्लभ है)। एचटीएमएल 5 कैनवास उस सम्मेलन का पालन करता है क्योंकि एचटीएमएल एक दस्तावेज़ अवधारणा (इसलिए डीओएम) पर आधारित है। यह पिक्सेल-आधारित होने के बारे में नहीं है। – LarsH

5

प्लॉट graph_height - y

जैसे: http://jsfiddle.net/nVUUM/

<canvas></canvas> 

<script> 
var e = document.getElementsByTagName('canvas')[0]; 
var c = e.getContext('2d'); 

function plot(x,y) { 
    c.fillRect(x, e.height-y, 5, 5); 
} 

plot(100,50); 
plot(200,100); 
</script> 
+0

उह। मैंने यह दृष्टिकोण लिया है, लेकिन थोड़ी देर के बाद, उस * हर * कॉल पर ऐसा करने के लिए जिसमें एक y समन्वय शामिल है, बहुत कठिन, त्रुटि-प्रवण, और अनावश्यक रूप से अव्यवस्थित है। मैं बहुत अधिक उपयोग करता हूं http://stackoverflow.com/a/33499668/423105 – LarsH

0

यह जहां .scale मैं सिर्फ यह कोशिश की डाल पर निर्भर करता है और यह पहली बार में काम नहीं किया। आपको move के बीच .scale डालना होगा();

ctx.arc(50,50,50,0,2*Math.PI); ctx.moveTo(50,50); ctx.scale(1,-1); ctx.lineTo(50,100); ctx.stroke();

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