Page 1 of 1

Repair minor angle strength values

Posted: Tue Apr 23, 2024 8:05 am
by Jim Eshelman
I don't know if Mikestar13 used complicated "shaping" code for angularity, or it's a straight value. This makes a small difference in how the value is calculated.

Presuming a 3° "drop dead" outside orb for a minor angle, the strength of a minor angle contact is shown by cos 30x (x is the orb in degrees) where only positive values will be produced within the orb range of identified aspects.

This btw is a specific case of the generalized formula cos (360/y)x where y is a multiplier based on the width of the aspect's full curve. Here are some useful examples:

A 3° orb (either side) means a 6° width for the "in aspect" part (the part that produces a positive value in the score) and double that - 12° - for the negative values (that we never see). Thus, the formula is cosine of (360°/12°)x, or 30x.

Similarly, a 10° orb is 20° wide for positive scores and 40° wide for the positive and negative values of the curve, so the equation is cosine of (360°/40°)x or 9x.

Since the aspect's full curve is always four times the maximum orb,, y = 4z where z is the maximum orb. That means that 360/y = 360/4z = 90/z. So we can restate the general strength formula as cos (90/z)x where z is the maximum orb allowed (the Class 3 orb).

FEATURE FIX - Repair minor angle strength values

Posted: Tue Apr 23, 2024 8:55 am
by Jim Eshelman
However, there is an important scaling difference between aspects and angularity. Here is a simple explanation of the difference, which requires (for example) that a 3° Class 3 orb for octiles and a 3° Class 3 orb for minor angles be treated differently.

The cosine function oscillates between a high of +1 and a low of -1.

For aspects, we scale this by adding 1 (so that it swings between +2 and 0) then divide by 2. Aspects are conceived as being effective when above 50% of their potential, so we want the outside permitted orb (user selected Class 3 boundary) to be a score of 50. (I think Mike N put in a special case where someone doesn't select a Class 3 orb that it is presumed to be 1.5x the Class 2 orb, which is how the sine curve behaves.) The score, then, for any aspect can be calculated by the above formula (cos (90/z)x where z is the maximum allowed orb) scaled by "add 1, divide all the result by 2" and only positive values will show.

For angularity, these numbers get treated differently. On the angularity curve, the shaping determines that background is a value under 25%, foreground is a value over 75%, and middleground is the rest. Therefore, minor angle contacts are conceived as being effective when above 75%. (The cosine shape from angularity score 100 to 75 has to look like the shape of an aspect from 100 to 50.) To get a minor angle with an outside orb of, say, 3° to have the same 75% score as a major angle with an outside orb of 10°, we have to do some further scaling (after the "add 1, divide by 2") of something like 75 + (x-50)/2 (I think I got that right).

Most of this stuff is already in the code - it doesn't have to be reinvented. The main thing is that the direct formula for getting the minor angle strength replace whatever is in there (which is probably more complicated). The rest of the above is so that you know how aspects vs. angularity are scaled (already built into the program).

Re: PRIORITY FEATURE FIX - Repair minor angle strength values

Posted: Mon May 27, 2024 9:22 pm
by Mike V
Jim Eshelman wrote: Tue Apr 23, 2024 8:05 am I don't know if Mikestar13 used complicated "shaping" code for angularity, or it's a straight value. This makes a small difference in how the value is calculated.
There's just a bit of shaping:

Code: Select all

def minor_angularity_curve(a):
    if a <= 2:
        x = 3 * a / 2
    else:
        x = (a - 2) * 7 + 3
    a = x * 6
    return math.cos(math.radians(a))
There are 2 separate "main angularity curves" and I'm not sure what the usage difference is between the two yet.

Re: PRIORITY FEATURE FIX - Repair minor angle strength values

Posted: Mon May 27, 2024 9:29 pm
by Jim Eshelman
I believe this can be dispensed with by using the general formula I gave above.

Mike N modified the strength formula by whatever the user picked as orbs. The base of the curve is double the Class 3 orb (or 1.5 x thr Class 2 or otherwise), and the full width of the aspect (include negative values) is double that. Then the curve is a straight cosine function.

Re: PRIORITY FEATURE FIX - Repair minor angle strength values

Posted: Mon May 27, 2024 9:39 pm
by Mike V
I plugged in cos(30x) and it looks a lot better. Here are some examples from some random Lunars I drew up:

Asc 24°Vi55' - planet 24°Sg23' - 98% strength (32' orb)
RAMC 40°31' - planet RA 308°06' - 65% strength (2°25' orb, if I did the math correctly)
RAMC 167°28' - planet RA 78°41' - 90% strength (1°13' orb? I think?)
Asc 2°Ar41' - planet 4°Cap35' - 77% strength (1°54' orb)

Does this look correct?

Re: PRIORITY FEATURE FIX - Repair minor angle strength values

Posted: Mon May 27, 2024 11:26 pm
by Jim Eshelman
Mike V wrote: Mon May 27, 2024 9:39 pm Asc 24°Vi55' - planet 24°Sg23' - 98% strength (32' orb)
RAMC 40°31' - planet RA 308°06' - 65% strength (2°25' orb, if I did the math correctly)
RAMC 167°28' - planet RA 78°41' - 90% strength (1°13' orb? I think?)
Asc 2°Ar41' - planet 4°Cap35' - 77% strength (1°54' orb)

Does this look correct?
My spread sheet for minor angles gives:

0°32' - 99.1%
2°25' - 82.5%
1°13' - 95.1%
1°54' - 88.6%

The formula in the spreadsheet is (COS(x*30)+3)/4 (where C2 is x). So the difference is the add 3, divide by 4, i.e., the whole curve from 0% to 100% and back down to 0% covers four times the maximum orb. (3° orb is plus-minus 3° or 6°, and that's only the positive-scoring part; you need to double it to 12° to get the entire "full circle" from -1 to +1 and back down to -1).

Treating your scores that way:

(.98 + 3)/4 = .995
(.65 + 3)/4 = .91
(.90 + 3)/4 = .975
(.77 + 3)/4 = .94

This still isn't coming out right for some reason?

(I'm off to bed, getting up at 4 AM to head to the airport.)

Re: PRIORITY FEATURE FIX - Repair minor angle strength values

Posted: Thu Jun 06, 2024 12:32 am
by Mike V
I'm just realizing now that Time Matters is rounding the raw angularity strength by this formula:
strength_percent = (angularity_strength + 1) * 50) rounded to nearest integer

This is applied to every strength value, for major and minor angles.

Here's an example using the minor angle formula we're talking about in this thread - that is,
(cos(radians(orb_degrees * 30)) + 3) / 4:
Random chart for 2 Jan 1998 0:45am PST

Eris RA: 22*47' (22.78); RAMC 114*41' (114.68); orb = 1.9*

The raw value I get for the minor angle formula is 0.88604, which after rounding in this manner, becomes 94%.

I'm not sure what the history is on this secondary correction. Should I scrap it?

Re: PRIORITY FEATURE FIX - Repair minor angle strength values

Posted: Thu Jun 06, 2024 8:33 am
by Jim Eshelman
Mike V wrote: Thu Jun 06, 2024 12:32 am I'm not sure what the history is on this secondary correction. Should I scrap it?
Good catch. This normalization is important but is being applied incorrectly to minor angles (they need a different normalization). Let me check myself, show what's going on, and confirm the procedure by reconstructing the logic. [Sorry, this is tedious. You can jump to the Conclusion at the end.]

Here is the main thing to know: The full major angle curve is really two cosine waves base to base (butt to butt) but the minor angle curve is only calculated as a single cosine curve (no need to add in a separate background antithesis curve). Therefore, in addition to the different Class 3 orb threshold, the major angle curve ranges from -2 to +2 (two "-1 to +1" curves) while the minor angle curve only ranges from -1 to +1.
  1. Let's look at the major angle model first: The more complex equations produce an initial value that ranges between -1.0 and +1.0 (the range of the cosine function). We want this displayed, instead, as 0% to 100%. I would do this by adding +1 (so that it ranges from 0.0 to +2.0), divide by 2 (so that it ranges from 0.0 to +1.0), then multiply by 100 (converting units to percents). -- Add 1, divide by 2, multiply by 100 is the same as add 1 and multiply by 50.
  2. Except... (I almost forgot this detail): This major angle -1.0 to +1.0 isn't a single cosine curve. It's TWO cosine curves (each of which begins as -1.0 to +1.0). This detail matters because we want to preserve the sinusoidal shape throughout.) This full major angle curve is really one foreground curve centered on each angle and one background curve centered on each cadent cusp. The shape of angularity, then, is not the whole -1 to +1 range of the butt-to-butt dual curves but, rather, the shape of the foreground curve only (or the background curve only). [Mike's larger process of calculating full quadrant major angle scores is beyond the current discussion.]
  3. For all angularity, scaling "above 50%" of the foreground curve as foreground, and "under -50%" of the background curve as background gives: Background is below 25%, foreground above 75%, and the rest is middleground. (This is important to know because aspects and angularity need to be treated differently.)
  4. For minor angles, the initial value using a 3° orb comes from this logic: 3° orb means 3° either side (6° range of "in orb" centered on 0°00') and then double that amount for the negative cosine range (6° either side = 12° "base" for the curve). The cosine curve needs to rise from -1 to +1 and back down the other side over this 12° range. Therefore, divide the whole 360° circle by 12° to get the 30x multiplier.
  5. Repeating in different words to be clear (presuming our default orbs and not worrying for now about the final display scaling): A cosine curve runs from +1 to -1. A major angle curve that reaches 0.0 (50% of the whole range) at 10° covers this full slope in 20°. -- To match this, a minor angle curve that reaches 0.0 (50% of the whole range) at 3° covers this full slope in 6° [on each side].
  6. The minor angle curve ranges -1 to +1. Its halfway point (0.0) has to be called 75% in the same way that a 10° major angle orb is called 75%. It gets a little confusing here (in order to preserve the shape of the curve): The full major angle curve includes a second curve "underneath" it giving the first 50%; this doesn't exist in the minor angle curve. So, for the minor angle (running from -1 to +1) we to add 1 (changing it to 0.0 to +2.0), spread this across 50 percentage points (x25 = 0% to 50%), and add 50 (= 50% to 100%). Foreground then begins at half of this, or 75%, just like the major angle curve.
  7. ((x +1)x25)+50 = 25x + 75
In my spreadsheet, I calculate this as cos(30x), add 3, divide by 4, then tell the program to convert it to percent. ((a+3)/4)*100 = (a+3)*25 = 25a+75, the same formula. The numbers match.
Here's an example using the minor angle formula we're talking about in this thread - that is,
f(cos(radians(orb_degrees * 30)) + 3) / 4:
Random chart for 2 Jan 1998 0:45am PST

Eris RA: 22*47' (22.78); RAMC 114*41' (114.68); orb = 1.9*

The raw value I get for the minor angle formula is 0.88604, which after rounding in this manner, becomes 94%.
For a 1.9° orb, I get: cos (30 x 1.9°) = 0.5446390
(0.5446390 + 3)/4 = 0.88615975
I may have copied wrong or used different number of significant digits, but we agree on 88.6% (89% for display).

Conclusion: The minor angles do need a correction, but it's not the same as for major angles because majors are two base-to-base connected cosine curves instead of one. The (x+1)*50 needs to be replaced by 25x+75. This produces the same result as (x+3)/4 that you are using.

Code: Select all

0	0	100.0%
0	30	99.1%
1	0	96.7%
1	30	92.7%
2	0	87.5%
2	30	81.5%
3	0	75.0%
3	30	68.5%
4	0	62.5%
4	30	57.3%
5	0	53.3%
5	30	50.9%
6	0	50.0%

Re: PRIORITY FEATURE FIX - Repair minor angle strength values

Posted: Thu Jun 06, 2024 6:43 pm
by Mike V
Got it! I rewrote the 2 major and 1 minor angularity curves and get the same results you do. Thank you for clarifying! Doubly thank you for showing the unreduced terms, because that allowed me to code it in that way and meticulously comment each individual operation.

This will be in the forthcoming release. I'm getting close with it, I just want to iron out a few kinks.