Verfasst am: 02.04.2018, 15:28
Titel: Winkelberechnung in Graphiken ohne manuellen Input
Hallo liebe Community,
ich bin zwar immernoch recht neu bei Matlab, aber ich habe einen Code erstellt, der ein paar Graphiken ausgibt und mit ginput die Koordinaten ausliest, beschriftet und anschließend zum Vergleich ein best-fit kreis reinlegt, damit ich die Abstände errechnen kann. Es wäre mir noch wichtig zu wissen, wie und an er welche Stelle ich einen Part einfügen kann, an dem ich noch die Winkel zwischen den angeklickten Punkten automatisch ausgeben lassen kann. Selbst habe ich das nicht geschafft, das einzigste was mir einfallen würde, wäre die Werte rauszuschreiben und in einer Exceltabelle manuell die Winkel zu berechnen. Dies ist aber auf Dauer dann doch etwas zu umständlich. Vielleicht kann mir hier jemand helfen, wie man das automatisch einfügen kann? Als Funktion für den Best-fir-Kreis verwende ich den circfit.m. Ich hänge noch die Ausgabegraphik an, dass man sich das besser vorstellen kann.
figure('NumberTitle','off','Name',A);
imshow(V);
imagesc(flip(V));
hold on;
set(gca,'ydir','normal');%(reverse or normal). y achse gedreht, aber spiegelt immer.
%ax.YAxisLocation = 'origin'
%fadenkrezfunktion
[x,y] = ginput
%kann später mit angeklickte Punkte nachvollziehen
%plot kann Excel manuell beigefügt werden. Umbenennen!
plot(x,y,'--ks',...
'LineWidth',1,...
'MarkerSize',5,...
'MarkerEdgeColor','r',...
'MarkerFaceColor',[0.5,0.5,0.5]) set(gca,'YDir','normal') for idx = 1:numel(x) text(x(idx),y(idx), num2str(idx), 'Color','green','FontSize',13);
end
[xfit,yfit,Rfit] = circfit(x,y);
figure('NumberTitle','off','Name',A);
imshow(V);
plot(x,y,'r.') hold on
rectangle('position',[xfit-Rfit,yfit-Rfit,Rfit*2,Rfit*2],...
'curvature',[1,1],'linestyle','-','edgecolor','k');
title(sprintf('Best fit: R = %0.1f; Ctr = (%0.1f,%0.1f)',...
Rfit,xfit,yfit));
plot(xfit,yfit,'k.') for idx = 1:numel(x) text(x(idx),y(idx), num2str(idx), 'Color','green','FontSize',13);
end axis equal
%xlim([xfit-Rfit-2,xfit+Rfit+2]) passt achsen dem kreis an
%ylim([yfit-Rfit-2,yfit+Rfit+2]) xlim([01600]) ylim([01200]) set(gca,'YDir','normal')
h = imdistline(gca); % zum verifizieren der Pixelabstände, oder zum schnellcheck
api = iptgetapi(h);
%sheet=1;
%xlRange= 'F6';
%xlswrite('Stegposition_Auswertung_Vorlage.xlsx',r,sheet,xlRange);
%alles in einem %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure('NumberTitle','off','Name',A);
imshow(V);
imagesc(flip(V));
hold on;
set(gca,'ydir','normal') colormapgray axisimage axis on
grid on;
hold on;
plot(x,y,'--ks',... %fadenkreuz
'LineWidth',1,...
'MarkerSize',5,...
'MarkerEdgeColor','r',...
'MarkerFaceColor',[0.5,0.5,0.5]) hold on;
plot(x,y,'r.') %circfit
hold on
rectangle('position',[xfit-Rfit,yfit-Rfit,Rfit*2,Rfit*2],...
'curvature',[1,1],'linestyle','-','edgecolor','k');
title(sprintf('Best fit: R = %0.1f; Ctr = (%0.1f,%0.1f)',...
Rfit,xfit,yfit));
plot(xfit,yfit,'k.') for idx = 1:numel(x) text(x(idx),y(idx), num2str(idx), 'Color','green','FontSize',13);
end
%xlim([xfit-Rfit-2,xfit+Rfit+2])
%ylim([yfit-Rfit-2,yfit+Rfit+2]) xlim([01600]) ylim([01200])
%%%Dieses Bild in vorgefertige Excel speichern
%
function[xc,yc,R,a] = circfit(x,y)
%
% [xc yx R] = circfit(x,y)
%
% fits a circle in x,y plane in a more accurate % (less prone to ill condition ) % procedure than circfit2 but using more memory % x,y are column vector where (x(i),y(i)) is a measured point
%
% % result is center point (yc,xc) and radius R % an optional output is the vector of coeficient a % describing the circle's equation
%
% x^2+y^2+a(1)*x+a(2)*y+a(3)=0
%
% By: Izhak bucher 25/oct /1991,
x=x(:); y=y(:);
a=[x y ones(size(x))]\[-(x.^2+y.^2)];
xc = -.5*a(1);
yc = -.5*a(2);
R = sqrt((a(1)^2+a(2)^2)/4-a(3));
Danke schonmal für's lesen und ich hoffe, es kann mir einer helfen.
Liebe Grüße an alle.
Edit. Wie macht man, dass die Werte, die in die Exceldatei geschrieben werden dort mit Kommas auftauchen, und nicht mit Punkt? Also, dass anstatt 345.26 in der Exceldatei dann 345,26 steht?
wenn du den Winkel in Excel ausrechnen kannst, warum nicht in MATLAB?
Ich würde zwei Geraden von einem Punkt durch die beiden anderen legen, dann die Steigungen dieser Geraden bestimmen, daraus den Winkel zur x-Achse und dann die Winkel voneinander abziehen.
Warum wandelst du die numerischen Daten in Strings um, bevor du sie nach Excel schreibst? Wenn du Excel entsprechend eingestellt hast, sollten Zahlen dort immer mit , als Dezimaltrennzeichen erscheinen.
Inwiefern funktioniert dein strrep-Ansatz nicht wie gewünscht?
hallo,
danke schonmal für deine Antwort.
Aber ich wäre eher auf der Suche nach einer Funktion, die meine Werte und den Mittelpunkt automatisch erkennt und dann die Winkel sofort nach Eingabe durch ginput ausrechnet. Ich wollte es eben nicht alles einzeln ausrechnen, da dies ja nur ein Beispiel ist und ich da eine große Datenmenge habe, wo dann das manuelle ausrechnen nicht sehr zeit-effizient wäre.
die meine Werte und den Mittelpunkt automatisch erkennt
Was genau soll woraus wie automatisch erkannt werden??
Zitat:
Ich wollte es eben nicht alles einzeln ausrechnen, da dies ja nur ein Beispiel ist und ich da eine große Datenmenge habe, wo dann das manuelle ausrechnen nicht sehr zeit-effizient wäre.
In der Regel ist das auch nicht nötig, sondern kann über Schleifen oder auch vektorisiert abgearbeitet werden. Mir ist allerdings schleierhaft, was du eigentlich machen willst.
Grüße,
Harald
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.