> |
restart;
ImplicitPlot3D_withCurveProjection := proc(f, n, x_range, y_range, z_range, x_t, y_t, z_t, t_range, num_vertical_lines)
local implicit_function, plot_result, space_curve, projection_curve, combined_plot, is_closed, projection_curve_length, space_curve_length, solve_z, t_values, t_increment, points, i, t, t_increment_vert, vertical_lines, x_val, y_val, z_val_space, z_val_projection;
uses plots, plottools, Student[Calculus1];
# Basic check on the correct number of arguments and their types
if nargs <> 10 or not type(f, algebraic) or not type(n, numeric) or
not type(x_range, range) or not type(y_range, range) or not type(z_range, range) or
not type(x_t, procedure) or not type(y_t, procedure) or not type(z_t, procedure) or
not type(t_range, range) or not type(num_vertical_lines, posint) then
error "Error: Incorrect input. Ensure all parameters are correctly typed and provided in the following order: ImplicitPlot3D_withCurveProjection_withPoints(f, n, x_range, y_range, z_range, x_t, y_t, z_t, t_range, num_vertical_lines). Each parameter must match its expected type and range.";
end if;
# Create the implicit expression
implicit_function := f = n;
# Generate the 3D plot of the implicit surface
plot_result := implicitplot3d(implicit_function, x = x_range, y = y_range, z = z_range, axes = boxed, grid = [30,30,30], style = surface, title = sprintf("Implicit plot of %a = %a with space curve and its vertical projection", f, n));
# Define the parametric space curve
space_curve := spacecurve([x_t(t), y_t(t), z_t(t)], t = t_range, color = "red", thickness = 2);
# Solve the surface equation for z if possible
solve_z := solve(f = n, z);
# Define the projection curve on the surface, vertical projection to z solved from surface equation
projection_curve := spacecurve([x_t(t), y_t(t), eval(solve_z, {x = x_t(t), y = y_t(t)})], t = t_range, color = "blue", thickness = 2, linestyle = 2);
# Check if the curve is closed
is_closed := evalb(x_t(op(1, t_range)) = x_t(op(2, t_range)) and y_t(op(1, t_range)) = y_t(op(2, t_range)));
# Calculate the length of the projection curve
projection_curve_length := evalf(Int(sqrt(diff(x_t(t), t)^2 + diff(y_t(t), t)^2 + (diff(eval(solve_z, {x = x_t(t), y = y_t(t)}), t))^2), t = t_range));
# Calculate the length of the space curve
space_curve_length := evalf(Int(sqrt(diff(x_t(t), t)^2 + diff(y_t(t), t)^2 + diff(z_t(t), t)^2), t = t_range));
# Calculate t values for points
t_values := [seq(op(1, t_range) + i * (op(2, t_range) - op(1, t_range)) / num_vertical_lines, i = 0 .. num_vertical_lines)];
# Calculate the increment for t values
t_increment := (op(2, t_range) - op(1, t_range)) / num_vertical_lines;
# Calculate points on the space curve
points := [seq([eval(x_t(t_values[i])), eval(y_t(t_values[i])), eval(z_t(t_values[i]))], i = 1..num_vertical_lines)];
# Calculate the increment for vertical t values
t_increment_vert := (op(2, t_range) - op(1, t_range)) / num_vertical_lines;
# Plot vertical lines from space curve to projection curve
vertical_lines := [];
for i from 0 to num_vertical_lines-1 do
x_val := eval(x_t(op(1, t_range) + i * t_increment_vert));
y_val := eval(y_t(op(1, t_range) + i * t_increment_vert));
z_val_space := eval(z_t(op(1, t_range) + i * t_increment_vert));
z_val_projection := eval(solve_z, {x = x_val, y = y_val});
vertical_lines := [op(vertical_lines), plottools:-line([x_val, y_val, z_val_space], [x_val, y_val, z_val_projection], color = "green")];
end do;
# Combine both plots, space curve, projection curve, and vertical lines
combined_plot := display({plot_result, space_curve, projection_curve, seq(vertical_lines[i], i = 1..num_vertical_lines)}, axes = boxed);
# Print the combined plot
print(combined_plot);
# Print whether the curve is closed or not
if is_closed then
printf("The space curve is closed.\n");
else
printf("The space curve is not closed.\n");
end if;
# Print the length of the projection curve
printf("Length of the projection curve (vertical green lines from spacecurve): %a\n", projection_curve_length);
# Print the length of the space curve
printf("Length of the space curve: %a\n", space_curve_length);
# Provide detailed information on how to use the procedure correctly after execution
printf("Procedure successfully executed. To correctly use this procedure, provide parameters in the following order and format:\n\n");
printf("f: Algebraic expression for the implicit equation. Example: x^2 + y^2 - 1\n");
printf("n: Numeric value that the implicit equation equals to. Example: 0\n");
printf("x_range, y_range, z_range: Valid ranges for x, y, and z coordinates. Example for x and y: -1.5..1.5, and for z: -2..2\n");
printf("x_t, y_t, z_t: Parametric expressions for the space curve as functions of t. Example: x_t: t -> cos(t), y_t: t -> sin(t), z_t: t -> 0\n");
printf("t_range: Range for the parameter t. Example: 0..2*Pi\n");
printf("num_vertical_lines: Number of vertical lines to be plotted.\n");
printf("Complete example call: ImplicitPlot3D_withCurveProjection_withPoints(x^2 + y^2 - 1, 0, -1.5..1.5, -1.5..1.5, -2..2, t -> cos(t), t -> sin(t), t -> 0, 0..2*Pi, 5)\n");
end proc:
# Voorbeeldaanroep
ImplicitPlot3D_withCurveProjection(x + y + z, 0, -10.5..10.5, -10.5..10.5, -20..20, t -> t, t -> 3*cos(t), t -> 3*sin(t), 0..1*Pi, 5);
|
|
|
The space curve is not closed.
Length of the projection curve (vertical green lines from spacecurve): 7.907090108
Length of the space curve: 9.934588266
Procedure successfully executed. To correctly use this procedure, provide parameters in the following order and format:
f: Algebraic expression for the implicit equation. Example: x^2 + y^2 - 1
n: Numeric value that the implicit equation equals to. Example: 0
x_range, y_range, z_range: Valid ranges for x, y, and z coordinates. Example for x and y: -1.5..1.5, and for z: -2..2
x_t, y_t, z_t: Parametric expressions for the space curve as functions of t. Example: x_t: t -> cos(t), y_t: t -> sin(t), z_t: t -> 0
t_range: Range for the parameter t. Example: 0..2*Pi
num_vertical_lines: Number of vertical lines to be plotted.
Complete example call: ImplicitPlot3D_withCurveProjection_withPoints(x^2 + y^2 - 1, 0, -1.5..1.5, -1.5..1.5, -2..2, t -> cos(t), t -> sin(t), t -> 0, 0..2*Pi, 5)
|
|
> |
ImplicitPlot3D_withCurveProjection(x + y + z, 0, -10.5..10.5, -10.5..10.5, -20..20, t -> cos(t), t -> sin(t), t -> 0, 0..2*Pi,8);
|
|
|
The space curve is closed.
Length of the projection curve (vertical green lines from spacecurve): 8.737752571
Length of the space curve: 6.283185307
Procedure successfully executed. To correctly use this procedure, provide parameters in the following order and format:
f: Algebraic expression for the implicit equation. Example: x^2 + y^2 - 1
n: Numeric value that the implicit equation equals to. Example: 0
x_range, y_range, z_range: Valid ranges for x, y, and z coordinates. Example for x and y: -1.5..1.5, and for z: -2..2
x_t, y_t, z_t: Parametric expressions for the space curve as functions of t. Example: x_t: t -> cos(t), y_t: t -> sin(t), z_t: t -> 0
t_range: Range for the parameter t. Example: 0..2*Pi
num_vertical_lines: Number of vertical lines to be plotted.
Complete example call: ImplicitPlot3D_withCurveProjection_withPoints(x^2 + y^2 - 1, 0, -1.5..1.5, -1.5..1.5, -2..2, t -> cos(t), t -> sin(t), t -> 0, 0..2*Pi, 5)
|
|
> |
ImplicitPlot3D_withCurveProjection(x + y +z, 0, -1.5..1.5, -1.5..1.5, -2..2, t -> cos(t), t -> sin(t), t -> 0, 0..2*Pi,10)
|
|
|
The space curve is closed.
Length of the projection curve (vertical green lines from spacecurve): 8.737752571
Length of the space curve: 6.283185307
Procedure successfully executed. To correctly use this procedure, provide parameters in the following order and format:
f: Algebraic expression for the implicit equation. Example: x^2 + y^2 - 1
n: Numeric value that the implicit equation equals to. Example: 0
x_range, y_range, z_range: Valid ranges for x, y, and z coordinates. Example for x and y: -1.5..1.5, and for z: -2..2
x_t, y_t, z_t: Parametric expressions for the space curve as functions of t. Example: x_t: t -> cos(t), y_t: t -> sin(t), z_t: t -> 0
t_range: Range for the parameter t. Example: 0..2*Pi
num_vertical_lines: Number of vertical lines to be plotted.
Complete example call: ImplicitPlot3D_withCurveProjection_withPoints(x^2 + y^2 - 1, 0, -1.5..1.5, -1.5..1.5, -2..2, t -> cos(t), t -> sin(t), t -> 0, 0..2*Pi, 5)
|
|
> |
ImplicitPlot3D_withCurveProjection(2*x+y^2-z, 0, -1.5..1.5, -1.5..1.5, -2..2, t -> 2*cos(t), t -> sin(t)+1, t -> 0, 0..1/2*Pi,10);
=============================================================
this example is from procedure 1 en its not the same plot
===============================================================
|
The space curve is not closed.
Length of the projection curve (vertical green lines from spacecurve): 3.653877920
Length of the space curve: 2.422112055
Procedure successfully executed. To correctly use this procedure, provide parameters in the following order and format:
f: Algebraic expression for the implicit equation. Example: x^2 + y^2 - 1
n: Numeric value that the implicit equation equals to. Example: 0
x_range, y_range, z_range: Valid ranges for x, y, and z coordinates. Example for x and y: -1.5..1.5, and for z: -2..2
x_t, y_t, z_t: Parametric expressions for the space curve as functions of t. Example: x_t: t -> cos(t), y_t: t -> sin(t), z_t: t -> 0
t_range: Range for the parameter t. Example: 0..2*Pi
num_vertical_lines: Number of vertical lines to be plotted.
Complete example call: ImplicitPlot3D_withCurveProjection_withPoints(x^2 + y^2 - 1, 0, -1.5..1.5, -1.5..1.5, -2..2, t -> cos(t), t -> sin(t), t -> 0, 0..2*Pi, 5)
|
|
|