EDIT:
Looking at your picture... I still don't see how one would "partially shadow" with this LOS function alone without creating some elaborate scheme sort of like what I was talking about in an above post about trying to create little array maps the size of each sprite. But, I think I was getting in over my head with that idea too.
The LOS function itself isn't able to record positions. But the way that it works it will make a "shadow cone" for you automatically. When checking how far you want to scan all around you, you will end up with "shadow cones" from objects blocking in the line of sight. So if you find that an array X/Y position is in a shadow of an object, then you can then specify on an array data element at that position is indeed shadowed/un-lit. That's how I do it with my Escape! game:
TYPE TYPE_MAP
object AS INTEGER ` object type
lit AS INTEGER ` =2 always lit, =1 if lit by torch, =0 Not lit. Player and goblins carry a torch
ENDTYPE
DIM array_pfmap(MAP_WIDTH,MAP_HEIGHT) AS TYPE_MAP
When a position in the array array_pfmap() needs to be set lit, I set the "lit" field of type TYPE_MAP to 1.
So, I guess if you want to pre-scan the entire area where the sun light can shine, you could as an example create a type field like "SunShadow" and set it to 1 when an X,Y position is shadowed by an object from the sun. When pre-scanning each position in the map array, the LOS function will create the "Shadow cone" automatically.
That would be a good idea to do that. Then when you map the ship's X/Y position to the grid array's X/Y position and that array element's "SunShadow" is set to 1, then draw the un-lit ship.
-----------------------------
On a side note:
I don't why, but in my Escape! game, I kept thinking I was only scanning from player position to the outer torch light range only. I think I was heavily in thought of doing just that at one point. If you ever tried drawing a 2d filled circle just by drawing a line from the center point outwards in all 360 directions, you'll noticed all pixels will not get filled up. That's why I check every position in the torch light area is to avoid skipping any positions the line of sight might skip.
Here's the part of code I use to scan every position in the torch light area:
rem clear the playfield with no light.
FOR local_mypos=0 TO MAP_HEIGHT-1
FOR local_mxpos=0 TO MAP_WIDTH-1
IF array_pfmap(local_mxpos,local_mypos).lit<2 THEN array_pfmap(local_mxpos,local_mypos).lit=0
NEXT
NEXT
rem light up number of spaces(TORCHLIGHT) away from player's current position
IF gPlayerTorch=1
local_mxpos=gPlayerX
local_mypos=gPlayerY
FOR local_j=local_mypos-TORCHLIGHT TO local_mypos+TORCHLIGHT
FOR local_i=local_mxpos-TORCHLIGHT TO local_mxpos+TORCHLIGHT
IF local_i>0 AND local_i<MAP_WIDTH-1
IF local_j>0 AND local_j<MAP_HEIGHT-1
IF LOS(local_mxpos,local_mypos,local_i,local_j)=1
IF array_pfmap(local_i,local_j).lit<2 THEN array_pfmap(local_i,local_j).lit=1
ENDIF
ENDIF
ENDIF
NEXT
NEXT
ENDIF
I actually clear the map every turn to make everything "un-lit". Then I check the torchlight range area to see what array x/y positions I need to set as "lit". ( NOTE that I COULD save the torch light area, then just "un-lit" the torch light area the next turn and then after that light up the torch light area at the player's position. That would be faster then clearing the whole playing field.)
So with that in mind, the bigger the size of the array you make for the size of the map it covers, it may effect FPS performance more when you want to scan a larger area with the LOS function. It all depends on how you use it.