You are not logged in. You can browse in the PowerBASIC Community, but you must click Login (top right) before you can post. If this is your first visit, check out the FAQ or Sign Up.

Announcement

Collapse

No announcement yet.

need codes to find equation of straight line y = mx + b

...I don't know what I would label MAT()...
You know, I'm not sure where values in the "trig tables" come from. I've just of always treated them as being fact. Hell, they work here.

Mat() operations are generally classed as "matrix Algebra".

At a guess, I'd say "trig tables" come from Trigonometry
Computers generall calculate them, using the CORDIC algorithm.

Algebra and Trigonomentry, like Arithmetic are branches of Mathematics.

The formula is true, and its generalization may be used for other fractional powers, X ^ s = Exp(s * Log(X)), but I doubt it's used for the special case s = 1 / 2. That case is so common (geometry, statistics, physics, engineering) I imagine it would be especially optimized.

To go off on a tangent, X ^ n is X times itself n times. Call that the third operation, the first two operations being addition and multiplication. Multiplication is repeated addition and exponential is repeated multiplication. You can imagine a fourth operation which is repeated exponentiation, and ask if it could defined for fractional n as it can be for multiplication and exponentiation. An Internet search on
fourth operation
discovers an article about it – Bing #1, DDG #1, Google #8 (the rankings vary a bit over time).

Last edited by Mark Hunter; 12 May 2022, 12:22 AM.

Algorithms - interesting mathematical techniques with program code included.

the below codes with some graphics inclusive of X and Y axes, please comment on it and enhance it
so that a better program emerges. Noteworthy I have pirated some codes from Stuart and Dave Biggs as well as improving it with Dan Soper's suggestion. Thanks everyone on this

There are 10 data sets to test these codes and please uncomment each set to test it as well
as displaying its graphics

Code:

' Point on Line.bas
' https://forum.powerbasic.com/forum/user-to-user-discussions/programming/816417-need-codes-to-find-equation-of-straight-line-y-mx-b?p=816429#post816429
' Obtain the equation of a line given 2 points (x1,y1) and (x2,y2)
' check whether point (x3,y3) lies on this line
' Great Thanks to Stuart , Dave Biggs
#COMPILE EXE
#DIM ALL
FUNCTION PBMAIN() AS LONG
LOCAL x1,x2,x3,y1,y2,y3,gradM,IntC AS DOUBLE
LOCAL wstrF, wstrL , wstrBet AS WSTRING
LOCAL FlagbetX , FlagbetY AS LONG
LOCAL setNumSt AS STRING
'Set 1 -- y = 2x where test point is on the line and lies between
' the line points
'Line points
' x2 = 1 : y2 = 2
' x1 = 4 : y1 = 8
'Test point
' x3 = 3 : y3 = 6
' setNumSt = " 1"
'Set 2 -- answer check correct y = -3x -5 test point is NOT on line
' https://content.byui.edu/file/b8b83119-9acc-4a7b-bc84-efacf9043998/1/Math-2-11-2.html#WS1
'Line points
' x1 = -5 : y1 = 10
' x2 = -3 : y2 = 4
'Test point
' x3 = -2 : y3 = 7
' setNumSt = " 2"
'Set 3 -- answer check correct y = 6x +4 test point is on line but not between line points
' https://content.byui.edu/file/b8b83119-9acc-4a7b-bc84-efacf9043998/1/Math-2-11-2.html#WS1
'Line points
' x2 = -5 : y2 = -26
'x1 = -2 : y1 = -8
'Test point
' x3 = -7 : y3 = -38
' setNumSt = " 3"
'Set 4 -- answer check correct y = 6x +4 test point is on line and lies between
' the line points
' https://content.byui.edu/file/b8b83119-9acc-4a7b-bc84-efacf9043998/1/Math-2-11-2.html#WS1
'Line points
' x2 = -5 : y2 = -26
' x1 = -2 : y1 = -8
'Test point
' x3 = -3 : y3 = -14
' setNumSt = " 4"
'Set 5 -- answer check correct y = 4.5x - 24 test point is NOT on the line
' https://content.byui.edu/file/b8b83119-9acc-4a7b-bc84-efacf9043998/1/Math-2-11-2.html#WS1
'Line points
' x2 = 6 : y2 = 3
' x1 = 4 : y1 = -6
'Test point
' x3 = 3.6 : y3 = -10
' setNumSt = " 5"
'Set 6 -- answer check correct y = 1.5x - 2.5 test point is NOT on the line
' https://content.byui.edu/file/b8b83119-9acc-4a7b-bc84-efacf9043998/1/Math-2-11-2.html#WS1
'Line points
' x2 = 3 : y2 = 2
' x1 = 5 : y1 = 5
'Test point
' x3 = 4 : y3 = 4
' setNumSt = " 6"
' Set 7 -- horizontal line y = 2
'Line points
' x2 = 3 : y2 = 2
' x1 = 5 : y1 = 2
'Test point
' x3 = 4 : y3 = 3
' setNumSt = " 7"
' Set 7B -- horizontal line y = 2
'Line points
' x2 = 3 : y2 = 2
' x1 = 5 : y1 = 2
'Test point
' x3 = 4 : y3 = 2
' setNumSt = " 7B"
'Set 8 -- Vertical line X = 2
'Line points
'x2 = 2 : y2 = 3
' x1 = 2 : y1 = -6
'Test point
' x3 = 2 : y3 = 3
' setNumSt = " 8"
'Set 8B -- Vertical line X = 2
'Line points
x2 = 2 : y2 = 3
x1 = 2 : y1 = -6
'Test point
x3 = 1.5 : y3 = -1.8
setNumSt = " 8B"
' check that all coordinates are valid
IF x1 = 0 AND y1 = 0 THEN
IF x2 = 0 AND y2 = 0 THEN
' all coord are Invalid
? " invalid coordinates "
EXIT FUNCTION
END IF
END IF
IF x1 = x2 AND y1 = y2 THEN
' all coord are Invalid
? " invalid coordinates "
EXIT FUNCTION
END IF
wstrF = "The equation for the line" & $LF & _
"(" & STR$(x1,4) & " , " & STR$(y1,4) & ") - (" & _
STR$(x2,4) & " , " & STR$(y2,4) & ") is :" & $LF
wstrL = $LF & $LF & "The point (" & STR$(x3,4) & " ," & STR$(y3,4) & ") "
LOCAL smallNum AS DOUBLE
smallNum = 0.0001
IF x1 = x2 THEN
'line is vertical
wstrF &= "X = " & STR$(x1,3)
IF x3 = x1 THEN
'point is on line
wstrL &= " is on the line"
ELSE
wstrl &= " is NOT on the line"
END IF
ELSE
wstrF &= "Y="
IF y1 = y2 THEN
' line is horizontal
wstrF &= STR$(y1,4)
IF y3 = y1 THEN
' point is on line
wstrL &= " is on the line"
ELSE
wstrl &= " is NOT on the line"
END IF
ELSE
' line is neither horizontal nor vertical
gradM = (y2-y1)/(x2-x1)
IntC = (x2*y1-x1*y2)/(x2-x1)
IF ABS(gradM)= 0 THEN
wstrF &= STR$(IntC,3)
ELSE
wstrF &= STR$(gradM,4) & "X " & IIF$(IntC>=0," +"," ") & STR$(IntC,3)
END IF
' Thanks to Dan to use a smallNum check
' https://forum.powerbasic.com/forum/user-to-user-discussions/programming/816417-need-codes-to-find-equation-of-straight-line-y-mx-b?p=816444#post816444
IF ABS(y3 - (gradM*x3 + IntC)) <= smallNum THEN
wstrL &= " is on the line"
' check if x3 is between x1 and x2
FlagbetX = 0
IF x2 >= x1 THEN
IF x3 >= x1 THEN
IF x3 <= x2 THEN
FlagbetX = 1
END IF
END IF
ELSE
IF x3 >= x2 THEN
IF x3 <= x1 THEN
FlagbetX = 1
END IF
END IF
END IF
' check if y3 is between y1 and y2
FlagbetY = 0
IF y2 >= y1 THEN
IF y3 >= y1 THEN
IF y3 <= y2 THEN
FlagbetY = 1
END IF
END IF
ELSE
IF y3 >= y2 THEN
IF y3 <= y1 THEN
FlagbetY = 1
END IF
END IF
END IF
wstrBet = $CRLF +"But it does NOT lies between the given Line points"
IF FlagbetX + FlagbetY = 2 THEN
wstrBet = $CRLF + "And it also lies between the given Line points"
END IF
ELSE
wstrl &= " is NOT on the line"
END IF
END IF
END IF
' draw the graphics
' pirated from
' https://forum.powerbasic.com/forum/user-to-user-discussions/powerbasic-for-windows/816259-how-to-draw-a-polygon-graphically?p=816366#post816366
LOCAL hGraph AS DWORD
LOCAL xmin,xmax ,ymin, ymax AS DOUBLE
LOCAL xmark, ymark AS DOUBLE
' marks per axis
LOCAL NumStep AS LONG
' canvas margins
LOCAL lm, tm, rm, bm AS DOUBLE
' scaled margins
LOCAL slm, stm, srm, sbm AS DOUBLE
' scaled xy coordinates for circular dots
LOCAL scx , scy , xrat , yrat AS DOUBLE
LOCAL TitleLab, XaxisLab, YaxisLab AS STRING
LOCAL hFont1, hFontR AS DWORD
' set up fonts
FONT NEW "Lucida Console", 10, 0, 0, 0, 0 TO hFont1
' rotated font (needs to be true type)
FONT NEW "Lucida Console", 10, 0, 0, 0, 900 TO hFontR
' obtain the min and max coord of the 3 points
' to do the scaling
xmin = MIN(x1,x2,x3)
ymin = MIN(y1,y2,y3)
xmax = MAX(x1,x2,x3)
ymax = MAX(y1,y2,y3)
GRAPHIC WINDOW NEW "Line and points",100,100,500,500 TO hGraph
GRAPHIC ATTACH hGraph, 0
'white background
GRAPHIC CLEAR %WHITE
' Left , Right, Top and Bottom Canvas Margins (in pixels)
' adjust these to the canvas window size
' lm = 80 : rm = 60 : tm = 70 : bm = 90
lm = 130 : rm = 60 : tm = 90 : bm = 140
' Calculate the scaled margins
slm = lm * (xmax-xmin)/(GRAPHIC(CANVAS.X) - lm - rm)
srm = rm * (xmax-xmin)/(GRAPHIC(CANVAS.X) - lm - rm)
stm = tm * (ymax-ymin)/(GRAPHIC(CANVAS.Y) - tm - bm)
sbm = bm * (ymax-ymin)/(GRAPHIC(CANVAS.Y) - tm - bm)
' adjustments if scaled margins are zero
IF slm = 0 THEN
slm = lm * (xmax -xmax*0.5)/(GRAPHIC(CANVAS.X) - lm - rm)
END IF
IF srm = 0 THEN
srm = rm * (xmax-xmax*0.5)/(GRAPHIC(CANVAS.X) - lm - rm)
END IF
IF stm = 0 THEN
stm = tm * (ymax-ymax*0.5)/(GRAPHIC(CANVAS.Y) - tm - bm)
END IF
IF sbm = 0 THEN
sbm = bm * (ymax-ymax*0.5)/(GRAPHIC(CANVAS.Y) - tm - bm)
END IF
' ? STR$(slm) + " " + STR$(srm) + " " + STR$(stm) + " " + STR$(sbm)
' x , y ratios of canvas
xrat = (xmax-xmin)/GRAPHIC(CANVAS.X)
yrat = (ymax-ymin)/GRAPHIC(CANVAS.Y)
IF xrat = 0 THEN
xrat = (xmax-xmax*0.5)/GRAPHIC(CANVAS.X)
END IF
IF yrat = 0 THEN
yrat = (ymax-ymax*0.5)/GRAPHIC(CANVAS.Y)
END IF
' calculate the size of the circular dot for the points
' adjust the multiplier to suit size of dot
scx = 7 * xrat
scy = 7 * yrat
' Scale Windows so that points coordinates fit nicely
GRAPHIC SCALE (xmin-slm, ymax+stm) - (xmax+srm, ymin-sbm)
' Line is in Lime over a white background
GRAPHIC WIDTH 1
GRAPHIC COLOR %RGB_LIME, %WHITE
' Draw the line
GRAPHIC LINE (x1,y1) - (x2,y2)
' draw the points in large dots
GRAPHIC BOX (x1-scx,y1-scy) - _
(x1+scx, y1+scy),100,%RGB_BLUE,%RGB_BLUE
GRAPHIC BOX (x2-scx,y2-scy) - _
(x2+scx, y2+scy),100,%RGB_BLUE,%RGB_BLUE
' the third point in Magenta
GRAPHIC BOX (x3-scx, y3-scy) - _
(x3+scx, y3+scy),100,%RGB_MAGENTA,%RGB_MAGENTA
' draw the axes -------------------------------------------------------
' calculate axes mark spacing based on data range / values
NumStep = 10
IF xmax = xmin THEN
xmark = CalculateStepSize(xmax*0.5, xmax, NumStep)
ELSE
xmark = CalculateStepSize(xmin, xmax, NumStep)
END IF
IF ymax = ymin THEN
ymark = CalculateStepSize( ymax*0.5, ymax, NumStep)
ELSE
ymark = CalculateStepSize(ymin, ymax, NumStep)
END IF
' Draw the axes labels
GRAPHIC COLOR %RGB_MEDIUMBLUE, %WHITE
TitleLab = "Plot for data set #" + setNumSt
GRAPHIC SET FONT hFont1
GRAPHIC SET POS (xmax-(xmax-xmin)/2 - _
GRAPHIC(TEXT.SIZE.X, TitleLab)/2, ymax + stm*0.4)
GRAPHIC PRINT TitleLab
' Display the x axis label
XaxisLab = "X-Axis"
GRAPHIC SET POS (xmax-(xmax-xmin)/2 - _
GRAPHIC(TEXT.SIZE.X, XaxisLab)/2, ymin - sbm*0.45)
GRAPHIC PRINT XaxisLab
' Draws the x axis line
GRAPHIC WIDTH 2
GRAPHIC COLOR %RGB_BLACK, %WHITE
GRAPHIC LINE (xmin, ymin) - (xmax, ymin)
GRAPHIC WIDTH 1
' draw marks on the x axis
LOCAL nchar AS LONG
LOCAL rr AS DOUBLE
LOCAL km AS LONG
km = 0
FOR rr = xmin TO xmax STEP xmark
INCR km
GRAPHIC LINE (rr, ymin) - (rr, ymin-GRAPHIC(CELL.SIZE.Y)*0.75)
' Display the mark values
nchar =LEN( TRIM$(STR$(rr),ANY CHR$(0) + CHR$(32)+ CHR$(10) + CHR$(13)+ CHR$(9)))
IF nchar = 1 THEN
GRAPHIC SET POS STEP (-GRAPHIC(CELL.SIZE.X)*0.55, - GRAPHIC(CELL.SIZE.Y)*0.5)
ELSEIF nchar = 2 THEN
GRAPHIC SET POS STEP (-GRAPHIC(CELL.SIZE.X)*0.9, - GRAPHIC(CELL.SIZE.Y)*0.5)
ELSEIF nchar = 3 THEN
GRAPHIC SET POS STEP (-GRAPHIC(CELL.SIZE.X)*1.5, - GRAPHIC(CELL.SIZE.Y)*0.5)
ELSE
GRAPHIC SET POS STEP (-GRAPHIC(CELL.SIZE.X)*1.8, - GRAPHIC(CELL.SIZE.Y)*0.5)
END IF
' print the scale values on x axis
' (alternate values only to prevent clutter)
IF km MOD 2 = 0 THEN
IF xmark < .1 THEN
GRAPHIC PRINT TRIM$(FORMAT$(rr, "0.00"))
ELSEIF xmark < 1 THEN
GRAPHIC PRINT TRIM$(FORMAT$(rr, "0.0"))
ELSE
GRAPHIC PRINT TRIM$(rr)
END IF
END IF
NEXT rr
' Display the y axis label
' Using rotated font at 90deg
YaxisLab = "Y-Axis"
GRAPHIC SET FONT hFontR
GRAPHIC SET POS (xmin-slm*.7, (ymax-(ymax-ymin)/2) _
- GRAPHIC(TEXT.SIZE.X, YaxisLab)/2)
GRAPHIC PRINT YaxisLab
' back to font1
GRAPHIC SET FONT hFont1
' Draw the y axis line
GRAPHIC WIDTH 2
GRAPHIC COLOR %RGB_BLACK, %WHITE
GRAPHIC LINE (xmin, ymin) - (xmin, ymax)
GRAPHIC WIDTH 1
' draw marks on the Y axis
LOCAL tmpSt AS STRING
km = 0
FOR rr = ymin TO ymax STEP ymark
INCR km
GRAPHIC LINE (xmin, rr) - (xmin-GRAPHIC(CELL.SIZE.X), rr)
' Display the mark values
IF rr < .1 THEN
tmpSt = TRIM$(FORMAT$(rr, "0.00"))
ELSEIF rr < 1 THEN
tmpSt = TRIM$(FORMAT$(rr, "0.0"))
ELSEIF rr = 0 THEN
tmpSt = TRIM$(STR$(rr))
ELSE
tmpSt = TRIM$(STR$(rr))
END IF
nchar =LEN(TRIM$(tmpSt,ANY CHR$(0) + CHR$(32)+ CHR$(10) + CHR$(13)+ CHR$(9)))
IF rr = 0 THEN
nchar = 1
END IF
IF nchar <= 2 THEN
GRAPHIC SET POS STEP (-GRAPHIC(CELL.SIZE.X)*3, GRAPHIC(CELL.SIZE.Y)/2)
ELSEIF nchar = 3 THEN
GRAPHIC SET POS STEP (-GRAPHIC(CELL.SIZE.X)*4.2, GRAPHIC(CELL.SIZE.Y)/2)
ELSEIF nchar >= 4 THEN
GRAPHIC SET POS STEP (-GRAPHIC(CELL.SIZE.X)*4.5, GRAPHIC(CELL.SIZE.Y)/2)
END IF
' print scale values -- alternate values only
' to prevent cluther
IF km MOD 2 = 0 THEN
IF ymark < .1 THEN
GRAPHIC PRINT TRIM$(FORMAT$(rr, "0.00"))
ELSEIF ymark < 1 THEN
GRAPHIC PRINT TRIM$(FORMAT$(rr, "0.0"))
ELSE
GRAPHIC PRINT TRIM$(rr)
END IF
END IF
NEXT rr
' display the messagebox
? wstrF & wstrL & wstrBet
GRAPHIC WAITKEY$
GRAPHIC WINDOW END hGraph
END FUNCTION
' Thanks to Dave Biggs
' Compute the marks positions on the axes
' Approximately there are around 10 marks on each axes
FUNCTION CalculateStepSize(dmin AS DOUBLE, dmax AS DOUBLE, NStep AS LONG) AS DOUBLE
LOCAL dRange, tempstep, StepSize AS DOUBLE
LOCAL mag, magPow, magMsd, mult AS LONG
' NStep = 10 ' eg maximum marks on axis
dRange = dmax -dmin
IF dRange = 0 THEN
EXIT FUNCTION
END IF
' calculate an initial guess at step size
tempStep = dRange/NStep
' scale up low magnitude step sizes (avoid negative log10 values)
WHILE tempstep < 1
TempStep = TempStep * 10
INCR mult
WEND
' get the magnitude of the step size
mag = FIX(LOG10(tempStep))
magPow = 10^mag
' calculate most significant digit of the new step size
magMsd = ((tempStep/magPow) + 0.5)
' promote the MSD TO either 1, 2, OR 5
IF (magMsd > 5.0) THEN
magMsd = 10.0
ELSEIF (magMsd > 2.0) THEN
magMsd = 5.0
ELSEIF (magMsd > 1.0) THEN
magMsd = 2.0
END IF
StepSize = magMsd*magPow
' reduce scaled up magnitudes if required
StepSize = StepSize / 10^mult
' Adjust _min and _max
dmin = StepSize * INT(dmin/StepSize)
dmax = StepSize * CEIL(dmax/StepSize)
FUNCTION = StepSize
END FUNCTION

No, no, before that. Like, how the heck did Euclid get them?

Euclid din't know about sines etc. You are confusing trigonomentry with geometry (the axioms of which Euclid did develop). SInes etc didn't come into use until the Indian and Arabic mathematicians derived the concepts many centuries later.

It's a long story. Early trigonometry came a few centuries after Euclid and started with the chord - the arc subtended by an angle and the ratio of the chord to the radius. That one is easly to derive since 1° is 1/360th of the circumference. It is what thet Greeks such as Ptolemy used for astronomical claculations.

No, no, before that. Like, how the heck did Euclid get them?

It's absolutely simple.
You look at the thing, and you say to yourself that there must be a fixed relationship between two aspects.
Then you look for that relationship. Eventually, you are able to obtain enough data from observations.
Then you are able to construct a formal expression of the relationship, which you then test.
I can get the first part. The rest is Greek.

The world is strange and wonderful.*
I reserve the right to be horrifically wrong.
Please maintain a safe following distance.
*wonderful sold separately.

We process personal data about users of our site, through the use of cookies and other technologies, to deliver our services, and to analyze site activity. For additional details, refer to our Privacy Policy.

By clicking "I AGREE" below, you agree to our Privacy Policy and our personal data processing and cookie practices as described therein. You also acknowledge that this forum may be hosted outside your country and you consent to the collection, storage, and processing of your data in the country where this forum is hosted.

## Comment