Søren-Emil Cramer

20 Reputation

3 Badges

1 years, 287 days

MaplePrimes Activity


These are replies submitted by

@acer Thank you!

@acer Thank you for the quick answer, it worked!

As you mentioned, it would be more efficient to use a module for defining the helper functions and calculations. If it's not too much trouble, could you help me convert the current procedure into a module?

Furthermore, here is the updated code (that works):

triangle := proc({a::numeric := 0, b::numeric := 0, c::numeric := 0, AngleA::numeric := 0, AngleB::numeric := 0, AngleC::numeric := 0})
    local A, B, C, T, Tr, DegreeA, DegreeB, DegreeC, TA, TB, TC, Area, Centroid, AreaLabel, deg, rad, s;
    uses geometry, plots;

    # Function to convert degrees to radians
    rad := proc(deg) evalf(deg * Pi / 180) end proc;
    
    # Function to convert radians to degrees
    deg := proc(rad) evalf(rad * 180 / Pi) end proc;


    # Temporary variables for calculations
    local a_calc, b_calc, c_calc, AngleA_calc, AngleB_calc, AngleC_calc, AngleA_rad, AngleB_rad, AngleC_rad;

    a_calc := a;
    b_calc := b;
    c_calc := c;
    AngleA_calc := AngleA;
    AngleB_calc := AngleB;
    AngleC_calc := AngleC;

    # Calculate missing sides or angles
    if a_calc = 0 then
        if AngleA_calc <> 0 and AngleB_calc <> 0 then
            a_calc := b_calc * sin(rad(AngleA_calc)) / sin(rad(AngleB_calc));
        elif AngleA_calc <> 0 and AngleC_calc <> 0 then
            a_calc := c_calc * sin(rad(AngleA_calc)) / sin(rad(AngleC_calc));
        end if;
    elif b_calc = 0 then
        if AngleB_calc <> 0 and AngleA_calc <> 0 then
            b_calc := a_calc * sin(rad(AngleB_calc)) / sin(rad(AngleA_calc));
        elif AngleB_calc <> 0 and AngleC_calc <> 0 then
            b_calc := c_calc * sin(rad(AngleB_calc)) / sin(rad(AngleC_calc));
        end if;
    elif c_calc = 0 then
        if AngleC_calc <> 0 and AngleA_calc <> 0 then
            c_calc := a_calc * sin(rad(AngleC_calc)) / sin(rad(AngleA_calc));
        elif AngleC_calc <> 0 and AngleB_calc <> 0 then
            c_calc := b_calc * sin(rad(AngleC_calc)) / sin(rad(AngleB_calc));
        end if;
    end if;

    if AngleA_calc = 0 then
        AngleA_calc := deg(arccos((b_calc^2 + c_calc^2 - a_calc^2) / (2 * b_calc * c_calc)));
    end if;
    if AngleB_calc = 0 then
        AngleB_calc := deg(arccos((a_calc^2 + c_calc^2 - b_calc^2) / (2 * a_calc * c_calc)));
    end if;
    if AngleC_calc = 0 then
        AngleC_calc := 180 - AngleA_calc - AngleB_calc;
    end if;

    # Convert angles to radians for calculation
    AngleA_rad := rad(AngleA_calc);
    AngleB_rad := rad(AngleB_calc);
    AngleC_rad := rad(AngleC_calc);

    # Define points A, B, and C
    geometry:-point(A, 0, 0);
    geometry:-point(B, c_calc, 0);
    geometry:-point(C, b_calc * cos(AngleA_rad), b_calc * sin(AngleA_rad));

    # Calculate the area using Heron's formula
    s := (a_calc + b_calc + c_calc) / 2;
    Area := sqrt(s * (s - a_calc) * (s - b_calc) * (s - c_calc));
    Area := evalf(Area, 4);

    # Calculate the centroid of the triangle
    Centroid := [(0 + c_calc + b_calc * cos(AngleA_rad)) / 3, (0 + 0 + b_calc * sin(AngleA_rad)) / 3];

    # Text plot for side labels
    T := plots:-textplot([[1/2 * c_calc, 0, cat("c = ", c_calc), align = below], 
                          [1/2 * c_calc + 1/2 * b_calc * cos(AngleA_rad) + 1/30 * a_calc, 1/2 * b_calc * sin(AngleA_rad), cat("a = ", a_calc), align = right], 
                          [1/2 * b_calc * cos(AngleA_rad) - 1/30 * a_calc, 1/2 * b_calc * sin(AngleA_rad), cat("b = ", b_calc), align = left]]);

    # Text plot for angle labels
    TA := plots:-textplot([0, 0, cat(evalf(AngleA_calc), "°"), align = right]);
    TB := plots:-textplot([c_calc, 0, cat(evalf(AngleB_calc), "°"), align = left]);
    TC := plots:-textplot([b_calc * cos(AngleA_rad), b_calc * sin(AngleA_rad), cat(evalf(AngleC_calc), "°"), align = above]);

    # Text plot for the area of the triangle
    AreaLabel := plots:-textplot([Centroid[1], Centroid[2], cat("Area= ", Area), align = above]);

    # Display the triangle with labels
    plots:-display([geometry:-draw([geometry:-triangle(Tr, [A, B, C])], 
                      font = [times, roman, 18], labels = [x, y], axes = none, printtext = true), T, TA, TB, TC, AreaLabel]);
end proc;

@nm Thanks!

Page 1 of 1