我想创建一个尺寸(半径和高度)可变的圆锥模型。我当前模型的问题是,当高度太小时,虚线圆不会被灰色图形覆盖。有什么办法可以解决这个问题吗?
%%%%%%%%%%%%%%%%%% INTRODUCTION %%%%%%%%%%%%%%%%%%
\documentclass[border=10pt]{standalone}
%%%%%%%%%%%%%%%%%% PACKAGE %%%%%%%%%%%%%%%%%%
\usepackage{tikz, tkz-euclide}% permet de dessiner des figures, des graphiques
\usepackage{adjustbox}% permet de déterminer une taille de fenêtre
%% FONT
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tgadventor}% paquet de police de caractère TGadventor
\usepackage{sansmath}% Copie-colle la police active dans
% \sfdefault (/!\ N'EST PAS UNE POLICE DE CARACTÈRES)
\usepackage{xcolor}
%%%%%%%%%%%%%%%%%% INPUT %%%%%%%%%%%%%%%%%%
%\input{preamble}
%\input{parameters}
%\input{types/f3d_fig}
%%%%%%%%%%%%%%%%%% SETUP %%%%%%%%%%%%%%%%%%
\tikzset{volum3D/.style={font={\sansmath\sffamily\large}, line width=0.4mm, line cap=round, line join=round, >=latex,}}
%%%%%%%%%%%%%%%%%%%%%%%% SPHERE RADIUS LABEL %%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\tikzset{pics/cone radlab/.style={code={%
\tikzset{cone radlab/.cd,#1}%
\def\pv##1{\pgfkeysvalueof{/tikz/cone radlab/##1}}
\pgfmathsetmacro{\myan}{atan2(\pgf@zx,\pgf@xx)}
\begin{scope}[local bounding box=sph]
\path[cone radlab/corps]
%%% Patrie supérieur
plot[smooth,variable=\t,samples=19,domain=\myan:{-1*sign(\myan)*180+\myan}]
(0,
\pv{height},
0)
--
%%% Patrie Inférieur
plot[smooth,variable=\t,samples=19,domain=\myan:{-1*sign(\myan)*180+\myan}]
({\pv{ray}*\pv{scale}*cos(\t)},
0,
{\pv{ray}*\pv{scale}*sin(\t)})
-- cycle
;
\draw[thick, densely dashed]
%%% Arc Avant
plot[smooth,variable=\t,samples=19,domain={-1*sign(\myan)*180+\myan}:\myan]
({\pv{ray}*\pv{scale}*cos(\t)},
0,
{\pv{ray}*\pv{scale}*sin(\t)})
%%% Arc Arrière
plot[smooth,variable=\t,samples=19,domain={sign(\myan)*180+\myan}:\myan]
({\pv{ray}*\pv{scale}*cos(\t)},
0,
{\pv{ray}*\pv{scale}*sin(\t)})
;
\end{scope}
%% Dot (0,0)
\draw
(0,0,0) node[circle, fill=black, inner sep=1pt] {} coordinate (o)
(\pv{ray},0,0) coordinate (r)
;
%% Barre de mesure du rayon
\draw[densely dashed, <->]
(o) --
(r) node[midway, below, inner sep=6pt] {\pv{lab}}
;
}},
cone radlab/.cd,
ray/.initial=5,
height/.initial=10,
lab/.initial=5 cm,
scale/.initial=1,
corps/.style={draw,fill=black!15},
}
\makeatother
%%%%%%%%%%%%%%%%%% DOCUMENT %%%%%%%%%%%%%%%%%%
\begin{document}
\begin{tikzpicture}[volum3D, x={(0:1cm)}, y={(90:1cm)}, z={(89:0.4cm)}]
% calibration cross
%\pic at (5,0,0) {calcross};
% Figures
\pic{cone radlab};
\node[below, yshift= -36pt, text=orange] at (0,0,0) {D};
\end{tikzpicture}
\end{document}
用按高度计算的方程式来解决这个问题是不可能的吗?所以这部分应该是:‘绿色部分——左侧蓝色部分——左侧红色部分——右侧红色部分——右侧蓝色部分——循环’
答案1
我不确定我是否完全理解您要做什么,所以这可能不是您想要的!
如果你只想画一个圆锥,你可以手工画。在这种情况下,你只需要在圆锥的底部椭圆上找到切线通过顶点的点(即图中红色和蓝色部分的交点)。
对于圆(而不是椭圆),使用三角函数,您可以轻松找到“目标”角度的表达式。如果我没记错的话,对应点在缩放时应该是“不变的”,因此您可以绘制圆的图形,然后沿 y 轴缩放。
\documentclass[tikz,border=5mm]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \R in {1.1,1.6,...,4}{
\begin{scope}[shift={(5*\R,0)}]
%% Draw circle
\draw[dotted] (0,0) circle (1);
%% Compute the angle (and plot the angle)
\pgfmathsetmacro\angle{acos(1/\R)}
\draw[opacity=.1] (90+\angle:1)--(0,0)--(90+360-\angle:1);
%% Draw the cone
\draw (90+\angle:1) arc (90+\angle:90+360-\angle:1) -- (0,\R) -- cycle;
\end{scope}
}
\def\R{6}
\begin{scope}[shift={(22,0)},yscale=.5]
\draw[dotted] (0,0) circle (1);
\pgfmathsetmacro\angle{acos(1/\R)}
\draw (90+\angle:1) arc (90+\angle:90+360-\angle:1) -- (0,\R) -- cycle;
\end{scope}
\end{tikzpicture}
\end{document}
这使
请注意,因为我们缩放了整个图形,所以您需要将变量乘以\R
该值的倒数yscale
。
如果你仍然想使用 3D 坐标系,这可能会更复杂...你可以看看这个例子:http://www.texample.net/tikz/examples/map-projections/如果我理解正确的话,你的问题对应于绘制纬度圆。