2012-03-10 23 views
15

मैं वर्गबद्ध Lagrange बहुपदों की साजिश के लिए एक सरल इंटरफेस बनाने की कोशिश कर रहा हूँ। इसके लिए, आपको केवल 3 अंक (प्रत्येक के अपने एक्स, वाई, जेड निर्देशांक के साथ) की आवश्यकता होती है, जिन्हें बाद में वर्गिक लैंगेंज बहुपदों का उपयोग करके इंटरपोल किया जाता है।MATLAB प्लॉट इंटरैक्टिव कैसे बनाएं?

एक स्थिर संस्करण बनाना आसान है, या यहां तक ​​कि एक व्यक्ति जो वक्र को साजिश करने से पहले 3 अंक इनपुट करने देता है। लेकिन उपयोगकर्ता के लिए प्लॉट विंडो में किसी मौजूदा स्थिति को किसी अन्य स्थिति में खींचने के लिए भी संभव होना चाहिए, और फिर इस बिंदु की नई स्थिति का उपयोग करके वक्र को स्वचालित रूप से फिर से साजिश करना चाहिए!

enter image description here

तो संक्षेप में, उपयोगकर्ता किसी अन्य स्थान पर इन काले बिंदुओं को खींचें करने के लिए सक्षम होना चाहिए। उसके बाद (या खींचते समय), वक्र अद्यतन किया जाना चाहिए।

function Interact() 

% Interactive stuff here 

figure(); 
hold on; 
axis([0 7 0 5]) 

DrawLagrange([1,1; 3,4; 6,2]) 

function DrawLagrange(P) 

plot(P(:,1), P(:,2), 'ko--', 'MarkerSize', 10, 'MarkerFaceColor', 'k') 

t = 0:.1:2; 
Lagrange = [.5*t.^2 - 1.5*t + 1; -t.^2 + 2*t; .5*t.^2 - .5*t]; 

CurveX = P(1,1)*Lagrange(1,:) + P(2,1)*Lagrange(2,:) + P(3,1)*Lagrange(3,:); 
CurveY = P(1,2)*Lagrange(1,:) + P(2,2)*Lagrange(2,:) + P(3,2)*Lagrange(3,:); 

plot(CurveX, CurveY); 

मुझे लगता है कि मैं या तो WindowButtonDownFcn, WindowButtonUpFcn और WindowButtonMotionFcn, या छवि प्रसंस्करण उपकरण बॉक्स से ImPoint जैसे कार्यों का उपयोग करने के लिए है। पर कैसे?

[संपादित करें] इसे 3 डी में भी काम करना चाहिए, क्योंकि मैं इस अवधारणा को उत्पाद सतहों को टेंसर करने के लिए सामान्य बनाना चाहता हूं।

+0

क्या आपने कभी लिंकडाटा के साथ इसे हल करने का प्रयास किया है? –

उत्तर

3

शानदार सवाल! मुझे यह समस्या भी मिली है और आश्चर्य हुआ कि इसे पहले कैसे हल किया जाए, लेकिन इसमें कभी नहीं देखा। मेरा पहला विचार ginput का उपयोग करना था और फिर लाइन की दूरी को कम करना और निकटतम बिंदु ढूंढना था। मैंने सोचा कि एक हैक का थोड़ा सा था इसलिए मैंने चारों ओर देखा। लगता है कि वहाँ केवल उचित जवाब है और here with this code as an example.

%minimum absolute differences kick in again 
xx = 1:10; %xdata 
yy = exp(xx); 

plot(xx,yy); 
[xm ym] = ginput(1); %xmouse, ymouse 

%Engine 
[~, xidx] = min(abs(xx-xm)); %closest index 
[~, yidx] = min(abs(yy-ym)); 
x_closest = xx(xidx) %extract 
y_closest = yy(yidx) 

सुनिश्चित नहीं हैं कि यह कैसे 3 डी को आकर्षित करता है की पुष्टि की थी, लेकिन मैंने सोचा था कि यह एक अच्छी शुरुआत होगी की तरह।

+0

धन्यवाद, मुझे _ginput_ विकल्प नहीं पता था! हालांकि, एक बिंदु खींचना संभव नहीं है, या यह है? ** ImPoint ** पर अधिक जानकारी/उदाहरणों की खोज की और एक साधारण लिपि लिखी। मैं इसे एक उत्तर के रूप में पोस्ट करूंगा, लेकिन मैं अपना जवाब स्वीकार नहीं करूंगा क्योंकि यह 3 डी के लिए काम नहीं करता है। लेकिन शायद कुछ लोगों को यह उपयोगी लगेगा। – Ailurus

12

ठीक है, मैंने छवि प्रसंस्करण टूलबॉक्स से IMPoint विकल्प पर कुछ और जानकारी की खोज की, और इस स्क्रिप्ट को लिखा।

के बाद से ImPoint केवल एक 2D की स्थापना के लिए काम करता है (और मैं घटता के बजाय सतहों के साथ काम करने के लिए सक्षम होने के लिए 3 डी करने के लिए इस सामान्यीकरण करना चाहते हैं), यह वास्तव में एक स्वीकार्य जवाब नहीं है! लेकिन किसी से इसका फायदा हो सकता है, या यह पता चल सकता है कि इसे 3 डी में कैसे किया जाए।

% ------------------------------------------------- 
% This file needs the Image Processing Toolbox! 
% ------------------------------------------------- 

function Interact(Pos) 

% This part is executed when you run it for the first time. 
% In that case, the number of input arguments (nargin) == 0. 
if nargin == 0 

    close all; 
    clear all; 
    clc; 

    figure(); 
    hold on; 
    axis([0 7 0 5]) 

    % I do not know how to do this without global variables? 
    global P0 P1 P2 

    % GCA = Get handle for Current Axis 
    P0 = ImPoint(gca,1,1); 
    setString(P0,'P0'); 
    P1 = ImPoint(gca,2,4); 
    setString(P1,'P1'); 
    P2 = ImPoint(gca,6,2); 
    setString(P2,'P2'); 

    % Call subfunction 
    DrawLagrange(P0,P1,P2) 

    % Add callback to each point 
    addNewPositionCallback(P0,@Interact); 
    addNewPositionCallback(P1,@Interact); 
    addNewPositionCallback(P2,@Interact); 

else 

    % If there _is_ some input argument, it has to be the updated 
    % position of a moved point. 
    global H1 H2 P0 P1 P2 

    % Display X and Y coordinates of moved point 
    Pos 

    % Important: remove old plots! Otherwise the graph will get messy. 
    delete(H1) 
    delete(H2) 
    DrawLagrange(P0,P1,P2) 

end 

function DrawLagrange(P0,P1,P2) 

P = zeros(3,2); 
% Get X and Y coordinates for the 3 points. 
P(1,:) = getPosition(P0); 
P(2,:) = getPosition(P1); 
P(3,:) = getPosition(P2); 

global H1 H2 
H1 = plot(P(:,1), P(:,2), 'ko--', 'MarkerSize', 12); 

t = 0:.1:2; 
Lagrange = [.5*t.^2 - 1.5*t + 1; -t.^2 + 2*t; .5*t.^2 - .5*t]; 

CurveX = P(1,1)*Lagrange(1,:) + P(2,1)*Lagrange(2,:) + P(3,1)*Lagrange(3,:); 
CurveY = P(1,2)*Lagrange(1,:) + P(2,2)*Lagrange(2,:) + P(3,2)*Lagrange(3,:); 

H2 = plot(CurveX, CurveY); 

मैंने स्पष्टता के लिए कुछ टिप्पणियां जोड़े।

[संपादित करें] पूर्वावलोकन में वाक्यविन्यास हाइलाइटिंग बहुत अच्छा नहीं लग रहा है! क्या मुझे भाषा को कहीं भी हाइलाइट करने के लिए परिभाषित करना चाहिए?

+0

तो इस स्क्रिप्ट का परीक्षण करने के लिए, इसे ** Interact.m ** के रूप में सहेजें और इसे _without_ इनपुट तर्कों का आह्वान करें। – Ailurus

6

एक बेहतर समाधान (जिसे किसी भी अतिरिक्त टूलबॉक्स की आवश्यकता नहीं है) घटनाओं का उपयोग करना है। पहला कदम:

H = figure('NumberTitle', 'off'); 
set(H, 'Renderer', 'OpenGL'); 

set(H, 'WindowButtonDownFcn', @MouseClick); 
set(H, 'WindowButtonMotionFcn', @MouseMove); 
set(H, 'WindowScrollWheelFcn', @MouseScroll); 
set(H, 'KeyPressFcn', @KeyPress) 

अगले कदम MouseClick तरह कार्यों को परिभाषित करने के लिए है, इस जगह है जहाँ आप कैसे घटनाओं के लिए प्रतिक्रिया करने के लिए लागू होता है (उदा माउस बटन क्लिक किया जा, कुंजी दबाया जा रहा)।

इस बीच मैंने MATLAB में एक इंटरैक्टिव बी-स्पलाइन वातावरण लागू किया, स्रोत कोड (संक्षिप्त मैनुअल के साथ) https://github.com/pjbarendrecht/BsplineLab से डाउनलोड किया जा सकता है।

+0

लिंक अब मौजूद नहीं है! – Arash

+0

@Arash आप सही हैं, मेरे पुराने विश्वविद्यालय ने कुछ हफ्ते पहले पृष्ठ हटा दिया था। मैं एक बेहतर संस्करण के लिए गिटहब पेज बना सकता हूं या जियोजेब्रा के लिए कुछ लिख सकता हूं :) – Ailurus

+0

धन्यवाद, हम प्रतीक्षा कर रहे हैं :) – Arash

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