How could I calculate the size of dots, height, and width of cylinder by pixel?
7 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
희영
am 5 Jan. 2024
Kommentiert: Angelo Yeo
am 11 Jan. 2024
Hello.
I am a beginner in matlab.
I got the code in psychtoolbox that can make rotating cylinder.
I remember getting help here last time, so I'm asking a new question about the problem I wasn't able to solve.
I should know the width and height of cylinder and dot size by pixel unit to calculate visual angle.
But I could not know what matlab code to do this, only found the matlab code that change vector to pixel or image to pixel.
So I want to calculate the width and height of below cylinder code and dot size by pixel unit.
If anyone knows anything about this, I would appreciate it if you could let me know.
Thank you for reading this.
Below is rotating cylinder code file. It is consist of two file.
# first code file
clear;
makeCyl = 1;
%% parameters
W = 153; %width
ndot = 900;
NumFrames = 86;
stepD = 400; % ie the half perimeter of the cylinder
cylR = stepD/pi; %guarantee the cylinder aprroaches with the same distance per 180 degree as the figure walks a step
%% cylinder
if makeCyl
backCol=0.9;
dotx = sin((rand(1,ndot)-0.5)*pi)* W/2; %dots are more concentrated on the two boundaries after ttransformed to sin, more natural than sqrt
dotc = ones(1, ndot);
angs = 2*pi* rand(1,ndot);
angpf = 2*pi/NumFrames; %angle per frame
Cylin = NaN(NumFrames*3,ndot); %keep it the same format as the mov file
dotC = cell(NumFrames,1);
for zz = 1:NumFrames
Cylin(zz*3-2,:) = dotx;
Cylin(zz*3-1,:) = cylR*cos(angs);
Cylin(zz*3,:) = cylR*sin(angs); % all dots are in the same depth so that it won'd contain perspective cue when drawn by moglDrawDots3D
angs = angs-angpf;
dotc = ones(1, ndot);
dotc(:, mod(angs,2*pi)<=pi) = backCol;
dotC{zz}= [1;1;1]*dotc;
end
save('Cylin_aaa','Cylin' ,'ndot');
end
# second code file
InitializeMatlabOpenGL;
load('Cylin_aaa.mat')
nFrames = 60;
fr = 1;
InitializeMatlabOpenGL; % open GL reset, moglDrawDots3D Required for function execution
%Screen('Preference', 'SkipSyncTests', 1);
Screen('Preference', 'SkipSyncTests', 1) % Skip sync test for testing
whichScreen = max(Screen('Screens'));
[w, screenRect] = Screen('OpenWindow', whichScreen,[0 0 0],[]); % small screen output
ScreenCenter = [screenRect(3)/2 screenRect(4)/2];
commandwindow;
while fr <= 86
thefr = fr;
while thefr > nFrames; thefr =thefr-nFrames; end
disp(thefr); % Check frame progress
this_xyz = Cylin(thefr*3-2:thefr*3,:);
Screen('DrawDots',w, this_xyz(1:2,:),[],[255 255 255],ScreenCenter, 0);
% moglDrawDots3D(w, this_xyz, 1, [1 1 1]); %
Screen('Flip',w);
%WaitSecs(0.05); % To see the dot move slowly
fr = fr +1;
end
sca;
0 Kommentare
Akzeptierte Antwort
Angelo Yeo
am 9 Jan. 2024
Bearbeitet: Angelo Yeo
am 9 Jan. 2024
1. By default, each dot has a size of 1 pixel. See Psychtoolbox-3 - Screen(‘DrawDots’) for details. To quote:
“size” is the diameter of each dot in pixels (default is 1)
2. In Psychtoolbox, drawing unit of dots is pixels. For example, the script below will plot 2 dots at center and 10 pixels right to the center.
InitializeMatlabOpenGL; % open GL reset, moglDrawDots3D Required for function execution
Screen('Preference', 'SkipSyncTests', 1) % Skip sync test for testing
whichScreen = max(Screen('Screens'));
[w, screenRect] = Screen('OpenWindow', whichScreen,[0 0 0],[]); % small screen output
ScreenCenter = [screenRect(3)/2 screenRect(4)/2];
commandwindow;
myDots = ...
[0, 10;
0, 0];
Screen('DrawDots',w, myDots,5,[255 255 255],ScreenCenter, 0);
Screen('Flip', w);
KbStrokeWait
sca;
3. According to #2, the width and height of the cylinder can be calculated in pixel like below.
load('Cylin_aaa.mat');
temp = Cylin(1:2,:); x = temp(1,:); y = temp(2, :);
width = max(x) - min(x) % pixels
height = max(y) - min(y) % pixels
2 Kommentare
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Timing and presenting 2D and 3D stimuli finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!